Google সিস্টেম পরিষেবা APK স্বচ্ছতা সম্পূর্ণ যাচাইকরণ

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

যাচাইকরণ প্রক্রিয়া

একটি স্বচ্ছতা লগ একটি Merkle ট্রি দিয়ে বাস্তবায়িত হয় যার মধ্যে হ্যাশ থাকে। একটি লিফ নোডে ডেটা থাকে এবং একটি প্যারেন্ট নোডে তার সন্তানদের হ্যাশ থাকে।

মূলত, স্বচ্ছতা লগের টেম্পার-প্রমাণিত বৈশিষ্ট্য যাচাই করার জন্য Merkle ট্রিতে দুটি গণনা করা হয়: অন্তর্ভুক্তি প্রমাণ এবং ধারাবাহিকতা প্রমাণ। প্রথমটি প্রমাণ করে যে লগে একটি নির্দিষ্ট APK সংস্করণের সাথে সম্পর্কিত একটি এন্ট্রি রয়েছে। লগ এন্ট্রিতে একটি হ্যাশ রয়েছে, যা JSON ওয়েব টোকেন (JWT) আকারে কোড স্বাক্ষর টোকেনের SHA256 ডাইজেস্ট, যা সংশ্লিষ্ট APK থেকে পাওয়া যেতে পারে। দ্বিতীয়টি প্রমাণ করে যে যখন ট্রিতে নতুন এন্ট্রি যোগ করা হয়, তখন নতুন চেকপয়েন্টটি (ক্রিপ্টোগ্রাফিকভাবে) গাছের পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্যপূর্ণ।

একটি আচ্ছাদিত APK যাচাই করতে, একটি সাক্ষী চেকপয়েন্টের উপর ভিত্তি করে একটি অন্তর্ভুক্তি প্রমাণ পরীক্ষা করুন। মনে রাখবেন যে আমরা একটি মানসম্মত সাক্ষী প্রোটোকল ব্যবহার করে এই লগটিকে একটি পাবলিক উইটনেস নেটওয়ার্কের সাথে একীভূত করার পরিকল্পনা করছি। এটি একটি সাক্ষী চেকপয়েন্ট প্রদান করবে, যা লগের ধারাবাহিকতা নিশ্চিত করবে।

যদি আপনি নিজেকে বোঝাতে চান যে আপনার ডিভাইসে থাকা APK দাবিদার মডেলে করা দাবির সাথে সঙ্গতিপূর্ণ, তাহলে নীচের লেখাটি পড়ুন।

অন্তর্ভুক্তির প্রমাণ

একজন অ্যান্ড্রয়েড ব্যবহারকারী প্রথমে APK এবং এর প্রাসঙ্গিক মেটাডেটা বের করে, তারপর প্রকাশিত চেকপয়েন্টে থাকা রুট হ্যাশের সাথে তাদের রিকম্পিউটেড রুট হ্যাশের তুলনা করে তাদের ডিভাইসের একটি আচ্ছাদিত APK লগে আছে কিনা তা পরীক্ষা করতে পারেন। যদি তারা মিলে যায়, তাহলে অ্যান্ড্রয়েড ব্যবহারকারী থ্রেট মডেলে বর্ণিত কিছু সুরক্ষা সম্পর্কে নিশ্চিত হতে পারেন।

লগে APK অন্তর্ভুক্তি কীভাবে যাচাই করবেন

পূর্বে বর্ণিত হিসাবে, বর্তমানে কভার করা APK গুলির তালিকা ওভারভিউ পৃষ্ঠায় তালিকাভুক্ত পাওয়া যাবে।

যাচাইকরণের পূর্বশর্তসমূহ

আপনার ডিভাইস থেকে যে APKটি বের করেছেন তা আমাদের দাবি অনুসারে কিনা তা যাচাই করার আগে, নেটওয়ার্ক-সংযুক্ত কম্পিউটার থেকে ইনস্টল করে নিম্নলিখিত সরঞ্জামগুলির প্রয়োজন হবে।

অ্যান্ড্রয়েড ডিবাগ ব্রিজ (ADB)

ADB হল একটি টুল যা একটি অ্যান্ড্রয়েড ডিভাইসের সাথে যোগাযোগ করে, যা অ্যান্ড্রয়েড SDK প্ল্যাটফর্ম টুলস ওয়েবসাইটে পাওয়া যায়।

AAPT2 সম্পর্কে

AAPT2 (Android Asset Packaging Tool) হল একটি বিল্ড টুল যা একটি অ্যান্ড্রয়েড অ্যাপের রিসোর্সগুলির সংকলন এবং প্যাকেজিংয়ের জন্য ব্যবহৃত হয়। এটি অ্যান্ড্রয়েড SDK বিল্ড টুলস 26.0.2 এবং উচ্চতর সংস্করণে একটি স্বতন্ত্র টুল হিসাবে পাওয়া যেতে পারে।

বান্ডেলটুল

bundletool হল একটি টুল যা একটি অ্যান্ড্রয়েড অ্যাপ বান্ডেল (AAB) তৈরি করতে ব্যবহৃত হয়। এটি AAB কে APK তে রূপান্তর করতেও ব্যবহার করা যেতে পারে যা ডিভাইসে ইনস্টল করা যেতে পারে। এটি GitHub থেকে ডাউনলোড করা যেতে পারে।

অন্তর্ভুক্তি প্রমাণ যাচাইকারী

এটি একটি Go মডিউল যা আমরা Android Open Source Project (AOSP) এর মধ্যে avb নামক একটি git রিপোজিটরিতে প্রকাশ করেছি। এটি Google System Services APK ট্রান্সপারেন্সি লগ অনুসন্ধান করতে সক্ষম এবং লগে কোনও প্যাকেজ অন্তর্ভুক্ত আছে কিনা তা আউটপুট দেয়। এটি কীভাবে ব্যবহার করা হয় তার একটি উদাহরণ পরবর্তী বিভাগে পাওয়া যাবে।

এই টুলটি ডাউনলোড করতে, আপনাকে প্রথমে avb রিপোজিটরিটি ক্লোন করতে হবে।

computer:~$ git clone https://android.googlesource.com/platform/external/avb

যাচাইকারীর সোর্স কোডটি avb রিপোজিটরির মধ্যে tools/transparency/verify তে পাওয়া যাবে।

যাচাইকরণের জন্য একটি পেলোড তৈরি করুন

আমাদের দাবি অনুসারে আপনার ডিভাইস থেকে আপনি যে APK বের করেছেন তা যাচাই করতে, আপনাকে APK থেকে প্রাপ্ত তথ্য থেকে একটি লগ পেলোড তৈরি করতে হবে।

শুরু করার আগে, আপনার ডিভাইসে adb ডিবাগিং সক্ষম করে নিশ্চিত করুন যে adb আপনার ডিভাইসে ব্যবহার করা যেতে পারে।

তারপর, আপনার ডিভাইসে APK কোথায় ইনস্টল করা আছে তা চিহ্নিত করুন। এই নির্দেশিকার উদ্দেশ্যে, আমরা আমাদের কার্যকরী উদাহরণ হিসাবে Android System Key Verifier APK (com.google.android.contactkeys) ব্যবহার করব।

computer:~$ adb shell pm list packages -f | grep contactkeys
package:/data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk=com.google.android.contactkeys

যদি আপনার ডিভাইসে অ্যান্ড্রয়েড সিস্টেম কী ভেরিফায়ার APK ইনস্টল করা থাকে, তাহলে উপরের কমান্ডটি আপনার ডিভাইসে এটি কোথায় ইনস্টল করা আছে তা নির্দেশ করে একটি পাথ ফেরত দেবে। অন্যথায়, আপনি কোনও আউটপুট দেখতে পাবেন না

তারপর, এই কমান্ড ব্যবহার করে আপনার অ্যান্ড্রয়েড ডিভাইস থেকে আপনার কম্পিউটারে APK ডাউনলোড করুন (মনে রাখবেন যে আপনার ডিভাইসের প্রকৃত অবস্থান এবং APK ফাইলের নাম ভিন্ন হতে পারে):

computer:~$ mkdir -p /tmp/testdir && cd /tmp/testdir
computer:/tmp/testdir$ adb pull /data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk ./contactkeys_candidate.apk

আপনার ডাউনলোড করা APK এর প্যাকেজ নামটি পেতে এবং যাচাই করতে, আপনাকে প্রথমে APK আনজিপ করতে হবে, কারণ APK হল শেষ পর্যন্ত একটি বিশেষ ধরণের ZIP ফাইল।

computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/

এই ধাপে APK তৈরি করা সমস্ত ফাইল আনপ্যাক করা হবে। প্যাকেজের নাম এবং সংস্করণ APK এর ম্যানিফেস্টে পাওয়া যাবে, যা সাধারণত AndroidManifest.xml নামক একটি ফাইলে থাকে।

তবে, প্রাপ্ত ম্যানিফেস্ট ফাইলটি বাইনারি আকারে রয়েছে, যা মানুষের পঠনযোগ্য নয়। বাইনারি XML কে মানুষের পঠনযোগ্য আকারে রূপান্তর করার জন্য, আমরা পূর্বে ইনস্টল করা aapt2 টুলটি ব্যবহার করি ( পূর্বশর্ত হিসাবে ইনস্টল করার প্রয়োজন অনুসারে)।

computer:/tmp/testdir$ aapt2 dump badging ./contactkeys_candidate.apk
package: name='com.google.android.contactkeys' versionCode='7805' versionName='1.219.791156583' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'

উপরের আউটপুট থেকে, আমরা এখন নিশ্চিত হতে পারি যে এই APK এর প্যাকেজের নাম হল com.google.android.contactkeys এবং সংস্করণ নম্বর (versionCode) হল 1413

এখন, আমরা APK-এর মধ্যে কোড ট্রান্সপারেন্সি সিগনেচার অনুসন্ধান করব। এটি code_transparency_signed.jwt নামের একটি ফাইল হওয়া উচিত যা APK থেকে এক্সট্রাক্ট করা অন্যান্য ফাইলগুলির মধ্যে META-INF ফোল্ডারের মধ্যে থাকবে।

computer:/tmp/testdir$ sha256sum extracted/META-INF/code_transparency_signed.jwt
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11  code_transparency_signed.jwt

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

1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11
SHA256(Signed Code Transparency JWT)
com.google.android.contactkeys
1143

প্যাকেজ সংস্করণের পরে নতুন লাইন অক্ষরটিও লক্ষ্য করুন।

আপনি কন্টেন্টটি payload.txt এর মতো একটি ফাইলে সংরক্ষণ করতে পারেন। পরবর্তীতে অন্তর্ভুক্তি প্রমাণ পরীক্ষা করার সময় এটি কাজে আসবে।

APK কোড স্বাক্ষরের সত্যতা যাচাই করুন

এখন, আমাদের APK-তে এমবেড করা কোড সিগনেচার টোকেনের সত্যতা যাচাই করা উচিত। এটি করার জন্য, আমরা bundletool এবং প্রথমে সাইন করার জন্য ব্যবহৃত কী জোড়ার পাবলিক কী ব্যবহার করি। এগুলি সংশ্লিষ্ট APK-এর প্রতিটি বিভাগের মধ্যে প্রকাশিত হয়। ধরে নিচ্ছি যে আপনি পাবলিক কী সার্টিফিকেট (যেমন Android System Key Verifier এর জন্য) signing_cert_pubkey.pem নামের একটি ফাইলে সংরক্ষণ করেছেন, কোড সিগনেচার যাচাইকরণ করতে নীচের নির্দেশিকা অনুসরণ করুন।

প্রথমে, আপনার একটি জিপ আর্কাইভ তৈরি করা উচিত এবং জিপ আর্কাইভে প্রার্থী APK যোগ করা উচিত।

computer:/tmp/testdir$ zip -u test.zip contactkeys_candidate.apk
        zip warning: test.zip not found or empty
  adding: contactkeys_candidate.apk (deflated 58%)

computer:/tmp/testdir$ file test.zip
test.zip: Zip archive data, at least v2.0 to extract, compression method=deflate

আমরা এখন bundletool এর check-transparency কমান্ড ব্যবহার করে যাচাই করতে প্রস্তুত যে APK ক্যান্ডিডেটের মধ্যে এমবেড করা কোড স্বাক্ষর প্রকাশিত স্বাক্ষরের সাথে মিলে কিনা।

computer:/tmp/testdir$ java -jar BUNDLETOOL_INSTALL_PATH/bundletool-all-version.jar check-transparency \
  --mode=apk \
  --apk-zip=test.zip \
  --transparency-key-certificate=signing_cert_pubkey.pem

APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): D9 E1 73 5B 2A 39 51 27 3A 87 35 B7 66 9E F1 9E F5 3A F1 C1 27 5C BA 31 39 3C 18 40 8B 03 79 D0
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.

উপরের কমান্ডের আউটপুটে নিশ্চিত করা উচিত যে কোড ট্রান্সপারেন্সি সিগনেচার এবং কোড ট্রান্সপারেন্সি উভয়ই যাচাই করা হয়েছে। উদাহরণস্বরূপ, যদি আপনি Code transparency verification failed because the provided public key certificate does not match the transparency file , তাহলে এর অর্থ হল প্রশ্নে থাকা APK-এর কোড ইন্টিগ্রিটি সম্ভাব্যভাবে আপস করা হতে পারে এবং আপনার APK-কে বিশ্বাস করা উচিত নয় । মনে রাখবেন যে আপনি সঠিক পাবলিক কী সার্টিফিকেটের সাথে সেগুলি যাচাই করছেন কিনা তা দুবার পরীক্ষা করে দেখুন। অন্যথায়, যদি অন্য সবকিছু পরীক্ষা করে দেখা যায়, তাহলে এর অর্থ হল যে আপনি যে APK যাচাই করছেন তার জন্য কোড সিগনেচারের সত্যতা যাচাই করা হয়েছে।

প্যাকেজ অন্তর্ভুক্তি যাচাইকরণ (অন্তর্ভুক্তির প্রমাণ)

আপনার আগে তৈরি করা পেলোড ব্যবহার করে, আপনি এখন পরীক্ষা করতে প্রস্তুত যে প্রশ্নবিদ্ধ প্যাকেজটি স্বচ্ছতা লগে অন্তর্ভুক্ত করা হয়েছে কিনা।

অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্টের মধ্যে avb রিপোজিটরিতে একটি অন্তর্ভুক্তি প্রমাণ সরঞ্জাম প্রকাশিত হয়েছে। এটি চালানোর জন্য:

computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:external/avb/tools/transparency/verify$ go build cmd/verifier/verifier.go
computer:external/avb/tools/transparency/verify$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_system_apk

যাচাইকারী সংশ্লিষ্ট চেকপয়েন্ট এবং লগের বিষয়বস্তু ( টাইল ডিরেক্টরিতে পাওয়া যায়) ব্যবহার করে পরীক্ষা করে যে আপনার APK পেলোডটি স্বচ্ছতা লগে আছে কিনা, যাচাই করে যে এটি আসলেই Google দ্বারা প্রকাশিত।

কমান্ডের আউটপুট stdout এ লেখা হয়:

  • OK. inclusion check success! যদি প্যাকেজের কোড লগে অন্তর্ভুক্ত থাকে,
  • যদি না হয়, তাহলে FAILURE