দারোয়ান

গেটকিপার সাবসিস্টেম একটি ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্টে (TEE) ডিভাইস প্যাটার্ন/পাসওয়ার্ড প্রমাণীকরণ করে। গেটকিপার একটি হার্ডওয়্যার-ব্যাকড সিক্রেট কী সহ একটি HMAC এর মাধ্যমে পাসওয়ার্ড তালিকাভুক্ত করে এবং যাচাই করে। উপরন্তু, গেটকিপার পরপর ব্যর্থ যাচাইকরণ প্রচেষ্টাকে থ্রোটল করে এবং একটি নির্দিষ্ট সময়সীমা এবং পরপর ব্যর্থ প্রচেষ্টার একটি প্রদত্ত সংখ্যার ভিত্তিতে পরিষেবার অনুরোধগুলি প্রত্যাখ্যান করতে হবে।

যখন ব্যবহারকারীরা তাদের পাসওয়ার্ডগুলি যাচাই করে, তখন গেটকিপার হার্ডওয়্যার-সমর্থিত কীস্টোরে পাঠানোর জন্য একটি প্রমাণীকরণ প্রত্যয়ন স্বাক্ষর করতে TEE-প্রাপ্ত শেয়ার করা গোপনীয়তা ব্যবহার করে। অর্থাৎ, একটি গেটকিপার প্রত্যয়ন কীস্টোরকে সূচিত করে যে প্রমাণীকরণ-বাউন্ড কীগুলি (উদাহরণস্বরূপ, অ্যাপগুলি তৈরি করা কীগুলি) অ্যাপগুলির দ্বারা ব্যবহারের জন্য প্রকাশ করা যেতে পারে৷

স্থাপত্য

গেটকিপার তিনটি প্রধান উপাদান জড়িত:

  • gatekeeperd (দারোয়ান ডেমন)। একটি C++ বাইন্ডার পরিষেবা যা প্ল্যাটফর্ম-স্বাধীন যুক্তিযুক্ত এবং GateKeeperService জাভা ইন্টারফেসের সাথে সম্পর্কিত।
  • গেটকিপার হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL)hardware/libhardware/include/hardware/gatekeeper.h , এবং বাস্তবায়নকারী মডিউলে HAL ইন্টারফেস।
  • দারোয়ান (টিইই)gatekeeperd টিইই কাউন্টারপার্ট। গেটকিপারের একটি TEE-ভিত্তিক বাস্তবায়ন।

দারোয়ানের জন্য গেটকিপার HAL (বিশেষত hardware/libhardware/include/hardware/gatekeeper.h এ ফাংশন) এবং TEE-নির্দিষ্ট গেটকিপার উপাদান ( system/gatekeeper/include/gatekeeper/gatekeeper.h হেডকিপার ফাইলের উপর ভিত্তি করে) বাস্তবায়ন প্রয়োজন। এতে কী এবং কম্পিউটিং স্বাক্ষর তৈরি/অ্যাক্সেস করার জন্য বিশুদ্ধ ভার্চুয়াল ফাংশন অন্তর্ভুক্ত)।

LockSettingsService একটি অনুরোধ করে (বাইন্ডারের মাধ্যমে) যা Android OS-এ gatekeeperd ডেমনে পৌঁছায়। gatekeeperd ডেমন তারপর একটি অনুরোধ করে যা TEE তে তার প্রতিপক্ষের (দারোয়ান) কাছে পৌঁছায়:

দারোয়ান প্রবাহ
চিত্র 1. গেটকিপার দ্বারা প্রমাণীকরণের জন্য উচ্চ-স্তরের ডেটা প্রবাহ

gatekeeperd ডেমন অ্যান্ড্রয়েড ফ্রেমওয়ার্ক API-কে HAL-এ অ্যাক্সেস দেয় এবং কীস্টোরে ডিভাইস প্রমাণীকরণ প্রতিবেদনে অংশগ্রহণ করে। gatekeeperd ডেমন তার নিজস্ব প্রক্রিয়ায় চলে এবং সিস্টেম সার্ভার থেকে আলাদা।

HAL বাস্তবায়ন

gatekeeperd ডেমন পাসওয়ার্ড প্রমাণীকরণের জন্য gatekeeperd ডেমনের TEE কাউন্টারপার্টের সাথে যোগাযোগ করতে HAL ব্যবহার করে। এইচএএল বাস্তবায়ন অবশ্যই ব্লব সাইন (নথিভুক্ত) এবং যাচাই করতে সক্ষম হবে। প্রতিটি সফল পাসওয়ার্ড যাচাইকরণে উত্পন্ন প্রমাণীকরণ টোকেন (AuthToken) এর জন্য সমস্ত বাস্তবায়ন আদর্শ বিন্যাস মেনে চলবে বলে আশা করা হচ্ছে। AuthToken এর বিষয়বস্তু এবং শব্দার্থ সংক্রান্ত বিশদ বিবরণের জন্য, AuthToken বিন্যাস দেখুন।

hardware/libhardware/include/hardware/gatekeeper.h শিরোনাম ফাইলের বাস্তবায়নের জন্য অবশ্যই enroll এবং verify কার্যগুলি বাস্তবায়ন করতে হবে:

  • enroll ফাংশনটি একটি পাসওয়ার্ড ব্লব নেয়, এটিতে স্বাক্ষর করে এবং হ্যান্ডেল হিসাবে স্বাক্ষরটি ফেরত দেয়। ফিরে আসা ব্লব ( enroll করার জন্য একটি কল থেকে) অবশ্যই system/gatekeeper/include/gatekeeper/password_handle.h এ দেখানো কাঠামো থাকতে হবে।
  • verify ফাংশনটি অবশ্যই প্রদত্ত পাসওয়ার্ড দ্বারা উত্পাদিত স্বাক্ষরের সাথে তুলনা করবে এবং নিশ্চিত করবে যে এটি নথিভুক্ত পাসওয়ার্ড হ্যান্ডেলের সাথে মেলে।

নথিভুক্তকরণ এবং যাচাই করার জন্য ব্যবহৃত কীটি কখনই পরিবর্তন করা উচিত নয় এবং প্রতিটি ডিভাইস বুটে পুনরায় সংগ্রহযোগ্য হওয়া উচিত।

বিশ্বস্ত এবং অন্যান্য বাস্তবায়ন

বিশ্বস্ত অপারেটিং সিস্টেম হল টিইই পরিবেশের জন্য গুগলের ওপেন সোর্স বিশ্বস্ত ওএস এবং এতে গেটকিপারের একটি অনুমোদিত বাস্তবায়ন রয়েছে। যাইহোক, যতক্ষণ না TEE-এর একটি হার্ডওয়্যার-ব্যাকড কী এবং একটি সুরক্ষিত, একঘেয়ে ঘড়ি যা সাসপেন্ডে টিক টিক করে , ততক্ষণ পর্যন্ত আপনি গেটকিপার বাস্তবায়নের জন্য যেকোনো TEE OS ব্যবহার করতে পারেন।

ট্রাস্টি একটি অভ্যন্তরীণ আইপিসি সিস্টেম ব্যবহার করে সরাসরি কীমাস্টার এবং গেটকিপারের ( বিশ্বস্ত দারোয়ান ) এর ট্রাস্টি বাস্তবায়নের মধ্যে একটি ভাগ করা গোপন যোগাযোগের জন্য। এই ভাগ করা গোপনীয়তাটি পাসওয়ার্ড যাচাইকরণের প্রত্যয়ন প্রদানের জন্য কীস্টোরে পাঠানো AuthTokens স্বাক্ষর করার জন্য ব্যবহৃত হয়। বিশ্বস্ত গেটকিপার প্রতিটি ব্যবহারের জন্য কীমাস্টারের কাছ থেকে কী অনুরোধ করে এবং মানটি ধরে রাখে না বা ক্যাশে করে না। নিরাপত্তার সাথে আপোস না করে এমন কোনো উপায়ে এই গোপনীয়তা শেয়ার করার জন্য বাস্তবায়ন স্বাধীন।

পাসওয়ার্ড নথিভুক্ত এবং যাচাই করার জন্য ব্যবহৃত HMAC কীটি শুধুমাত্র গেটকিপারে প্রাপ্ত এবং রাখা হয়।

অ্যান্ড্রয়েড গেটকিপারের একটি সাধারণ C++ বাস্তবায়ন প্রদান করে যার জন্য শুধুমাত্র ডিভাইস-নির্দিষ্ট রুটিনগুলি সম্পূর্ণ করার প্রয়োজন হয়। আপনার TEE-এর জন্য ডিভাইস-নির্দিষ্ট কোড সহ একটি TEE গেটকিপার প্রয়োগ করতে, system/gatekeeper/include/gatekeeper/gatekeeper.h এ ফাংশন এবং মন্তব্যগুলি পড়ুন। TEE গেটকিপারের জন্য, একটি অনুগত বাস্তবায়নের প্রাথমিক দায়িত্বগুলির মধ্যে রয়েছে:

  • দারোয়ান এইচএএল মেনে চলা।
  • ফেরত দেওয়া AuthTokens অবশ্যই AuthToken স্পেসিফিকেশন ( প্রমাণিকরণে বর্ণিত) অনুযায়ী ফর্ম্যাট করা উচিত।
  • টিইই গেটকিপারকে অবশ্যই কিমাস্টারের সাথে একটি HMAC কী শেয়ার করতে সক্ষম হতে হবে, হয় চাহিদা অনুযায়ী একটি TEE IPC-এর মাধ্যমে কী অনুরোধ করে অথবা সর্বদা মূল্যের একটি বৈধ ক্যাশে বজায় রেখে।

ইউজার সিকিউর আইডি (এসআইডি)

একটি ব্যবহারকারী SID হল একজন ব্যবহারকারীর TEE প্রতিনিধিত্ব (কোনও Android ব্যবহারকারী আইডির সাথে কোন শক্তিশালী সংযোগ ছাড়াই)। SID একটি ক্রিপ্টোগ্রাফিক সিউডোর্যান্ডম নম্বর জেনারেটর (PRNG) দিয়ে তৈরি করা হয় যখনই কোনো ব্যবহারকারী আগের পাসওয়ার্ড না দিয়ে একটি নতুন পাসওয়ার্ড নথিভুক্ত করে। এটি একটি অবিশ্বস্ত পুনরায় নথিভুক্ত করা হিসাবে পরিচিত এবং সাধারণ পরিস্থিতিতে Android ফ্রেমওয়ার্ক দ্বারা অনুমোদিত নয়৷ একটি বিশ্বস্ত পুনরায় নথিভুক্ত করা হয় যখন একজন ব্যবহারকারী একটি বৈধ, পূর্ববর্তী পাসওয়ার্ড প্রদান করে; এই ক্ষেত্রে, ব্যবহারকারী SID নতুন পাসওয়ার্ড হ্যান্ডেলে স্থানান্তরিত হয়, এতে আবদ্ধ কীগুলি সংরক্ষণ করা হয়।

পাসওয়ার্ড নথিভুক্ত করা হলে পাসওয়ার্ড হ্যান্ডেলে পাসওয়ার্ড সহ ব্যবহারকারীর SID HMAC'ed করা হয়।

ব্যবহারকারীর SIDগুলি verify ফাংশন দ্বারা প্রত্যাবর্তিত AuthToken-এ লেখা হয় এবং সমস্ত প্রমাণীকরণ-বাউন্ড কীস্টোর কীগুলির সাথে যুক্ত হয় (অথটোকেন ফর্ম্যাট এবং কীস্টোরের বিশদ বিবরণের জন্য, প্রমাণীকরণ দেখুন)। enroll ফাংশনে একটি অবিশ্বস্ত কল ব্যবহারকারীর SID পরিবর্তন করবে, কলটি সেই পাসওয়ার্ডের সাথে আবদ্ধ কীগুলিকে অকেজো করে দেবে। আক্রমণকারীরা ডিভাইসের পাসওয়ার্ড পরিবর্তন করতে পারে যদি তারা অ্যান্ড্রয়েড ওএস নিয়ন্ত্রণ করে তবে তারা প্রক্রিয়ায় রুট-সুরক্ষিত, সংবেদনশীল কীগুলি ধ্বংস করে দেবে।

থ্রোটলিং অনুরোধ

গেটকিপারকে অবশ্যই ব্যবহারকারীর শংসাপত্রে ব্রুট-ফোর্স প্রচেষ্টাকে নিরাপদে থ্রোটল করতে সক্ষম হতে হবে। hardware/libhardware/include/hardware/gatekeeper.h তে দেখানো হয়েছে, HAL মিলিসেকেন্ডে একটি টাইমআউট ফেরত দেওয়ার ব্যবস্থা করে। টাইমআউট ক্লায়েন্টকে টাইমআউট শেষ না হওয়া পর্যন্ত গেটকিপারকে আবার কল না করার জন্য জানায়; মুলতুবি থাকা সময় শেষ হলে গেটকিপারের অনুরোধগুলি পরিষেবা দেওয়া উচিত নয়৷

একটি ব্যবহারকারীর পাসওয়ার্ড যাচাই করার আগে গেটকিপারকে অবশ্যই একটি ব্যর্থতা কাউন্টার লিখতে হবে। পাসওয়ার্ড যাচাই সফল হলে, ব্যর্থতার কাউন্টারটি সাফ করা উচিত। এটি একটি verify কল ইস্যু করার পরে এমবেডেড MMC (eMMC) নিষ্ক্রিয় করে থ্রটলিং প্রতিরোধ করে এমন আক্রমণ প্রতিরোধ করে। enroll ফাংশন ব্যবহারকারীর পাসওয়ার্ডও যাচাই করে (যদি প্রদান করা হয়) এবং একইভাবে থ্রোটল করা আবশ্যক।

ডিভাইস দ্বারা সমর্থিত হলে, এটি অত্যন্ত বাঞ্ছনীয় যে ব্যর্থতা কাউন্টারটি নিরাপদ স্টোরেজ লিখতে হবে। যদি ডিভাইসটি ফাইল-ভিত্তিক এনক্রিপশন সমর্থন না করে, বা যদি সুরক্ষিত সঞ্চয়স্থান খুব ধীর হয়, তাহলে বাস্তবায়নগুলি সরাসরি রিপ্লে প্রোটেক্টেড মেমরি ব্লক (RPMB) ব্যবহার করতে পারে।