দারোয়ান

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

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

স্থাপত্য

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

  • gatekeeperd (গেটকিপার ডেমন) — অ্যান্ড্রয়েডের একটি C++ বাইন্ডার পরিষেবা যা IGateKeeperService AIDL ইন্টারফেস বাস্তবায়নকারী প্ল্যাটফর্ম-স্বাধীন লজিক ধারণ করে, IGatekeeper এর অন্তর্নিহিত বিক্রেতা-নির্দিষ্ট বাস্তবায়নের উপর ভিত্তি করে।
  • গেটকিপার হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) পরিষেবাIGatekeeper AIDL ইন্টারফেসের একটি বিক্রেতা-নির্দিষ্ট বাস্তবায়ন। এই HAL পরিষেবাটি অ্যান্ড্রয়েডে চলে, কিন্তু মূল গেটকিপার কার্যকারিতা একটি নিরাপদ পরিবেশে চালানো প্রয়োজন, তাই এটি সাধারণত গেটকিপার TA-এর সাথে যোগাযোগ করে৷
  • গেটকিপার ট্রাস্টেড অ্যাপ্লিকেশন (TA) — একটি বিক্রেতা-নির্দিষ্ট বাস্তবায়ন যা TEE-তে চলে এবং প্রকৃত পাসওয়ার্ড বা প্যাটার্ন যাচাইকরণ করে।

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

দারোয়ান প্রবাহ

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

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

HAL বাস্তবায়ন

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

IGatekeeper HAL-এর ভেন্ডর ইমপ্লিমেন্টেশনগুলি অবশ্যই enroll এবং verify কার্যগুলি বাস্তবায়ন করবে:

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

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

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

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

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

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

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

  • IGatekeeper HAL আনুগত্য.
  • ফেরত আসা প্রমাণীকরণ টোকেন অবশ্যই HardwareAuthToken স্পেসিফিকেশন ( HardwareAuthToken.aidl এ বর্ণিত) অনুযায়ী ফরম্যাট করতে হবে।
  • TEE গেটকিপারকে অবশ্যই নিম্নলিখিতগুলির একটি ব্যবহার করে KeyMint এর সাথে একটি HMAC কী শেয়ার করতে সক্ষম হতে হবে:
    • ভাগ করা গোপন চুক্তি: গেটকিপার ISharedSecret HAL বাস্তবায়নের মাধ্যমে HMAC কী-এর প্রতি-বুট আলোচনায় অংশ নিতে পারে। এর জন্য দারোয়ান এবং কীমিন্ট উভয়েরই একটি সাধারণ পূর্বে ভাগ করা গোপনীয়তায় অ্যাক্সেস থাকা প্রয়োজন৷
    • সরাসরি অ্যাক্সেস: দারোয়ান একটি TEE-অভ্যন্তরীণ আন্তঃপ্রক্রিয়া যোগাযোগ ব্যবস্থা ব্যবহার করে KeyMint থেকে HMAC কী পুনরুদ্ধার করতে পারে, হয় চাহিদা অনুযায়ী বা প্রথম ব্যবহারে (তারপর ক্যাশে)।

ব্যবহারকারী সুরক্ষিত আইডি (SID)

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

একটি বিশ্বস্ত পুনরায় নথিভুক্ত করা হয় যখন একজন ব্যবহারকারী একটি বৈধ, পূর্ববর্তী পাসওয়ার্ড প্রদান করে, যেমন পাসওয়ার্ড পরিবর্তন করার সময়। এই ক্ষেত্রে, ব্যবহারকারী SID নতুন পাসওয়ার্ড হ্যান্ডেলে স্থানান্তরিত হয়, এতে আবদ্ধ কীগুলি সংরক্ষণ করা হয়।

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

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

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

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

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

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

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