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

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

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

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

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

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

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

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

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

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

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

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

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

গোলাং

যাচাইকরণ টুলটি Go ভাষায় লেখা হয়েছে। এটি বিল্ড করার জন্য Go সাইট থেকে Go 1.24 বা তার পরবর্তী সংস্করণ ইনস্টল করুন।

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

ADB হলো এমন একটি টুল যা অ্যান্ড্রয়েড ডিভাইসের সাথে যোগাযোগ করে ইমেজ পরীক্ষা করতে বা APK ফাইল এক্সট্র্যাক্ট করতে ব্যবহৃত হয় এবং এটি অ্যান্ড্রয়েড SDK প্ল্যাটফর্ম টুলস ওয়েবসাইটে পাওয়া যায়।

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

ইনক্লুশন প্রুফ ভেরিফায়ার হলো একটি গো মডিউল, যা ট্রান্সপারেন্সি লগ কোয়েরি করে এবং কোনো আর্টিফ্যাক্ট সেই লগে অন্তর্ভুক্ত আছে কিনা তা আউটপুট হিসেবে জানায়। এটি android-binary-transparency গিটহাব রিপোজিটরিতে https://github.com/android/android-binary-transparency/tree/main ঠিকানায় প্রকাশিত হয়েছে।

AOSP avb রিপোজিটরি ক্লোন করতে:

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

android-binary-transparency গিটহাব রিপোজিটরিটি ক্লোন করতে:

computer:~$ git clone https://github.com/android/android-binary-transparency

AAPT2

AAPT2 (অ্যান্ড্রয়েড অ্যাসেট প্যাকেজিং টুল) হলো একটি বিল্ড টুল যা একটি অ্যান্ড্রয়েড অ্যাপের রিসোর্সসমূহ কম্পাইল এবং প্যাকেজ করতে ব্যবহৃত হয়। এটি অ্যান্ড্রয়েড এসডিকে বিল্ড টুলস সংস্করণ ২৬.০.২ এবং তার পরবর্তী সংস্করণগুলোতে একটি স্বতন্ত্র টুল হিসেবে পাওয়া যায়।

বান্ডেলটুল

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

wget অথবা curl

wget এবং curl হলো এমন টুল যা ইন্টারনেট থেকে ফাইল পুনরুদ্ধার বা ডাউনলোড করতে ব্যবহার করা যায়। এই টুলগুলোর যেকোনো একটি আপনার সিস্টেমে ইনস্টল করা আছে কিনা তা নিশ্চিত করুন, কারণ ভেরিফিকেশন স্ক্রিপ্টগুলো এগুলোর ওপর নির্ভর করতে পারে।

Avbtool

avbtool ফ্যাক্টরি ইমেজের VBMeta ডাইজেস্ট গণনা করতে এবং বাইনারি যাচাই করতে ব্যবহৃত হয়। avb রিপোজিটরি ক্লোন করার পর (যেমনটি ইনক্লুশন প্রুফ ভেরিফায়ার বিভাগে দেখানো হয়েছে), ক্লোন করা avb ডিরেক্টরির মধ্যে avbtool.py পাওয়া যাবে। আপনাকে এই ডিরেক্টরিটি আপনার $PATH এনভায়রনমেন্ট ভেরিয়েবলে যোগ করতে হবে।

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool হলো একটি পাইথন স্ক্রিপ্ট যা পিক্সেলের bootloader.img এর ভেতরের উপাদানগুলো আনপ্যাক করতে ব্যবহৃত হয়। আপনি যদি APK ভেরিফাই করেন, তবে এটির প্রয়োজন নেই। এই টুলটি গুরুত্বপূর্ণ কারণ এটি avbtool.py ভেরিফিকেশনের জন্য প্রয়োজনীয় ইমেজগুলো খুঁজে পেতে সাহায্য করে।

এই টুলটি ব্যবহার করার জন্য, আপনার avbtool.py যে ডিরেক্টরিতে রয়েছে সেখানে নিম্নলিখিত তিনটি পাইথন স্ক্রিপ্ট ডাউনলোড করুন, fbpacktool.py এক্সিকিউটেবল করুন এবং সুবিধার জন্য fbpacktool.py তে fbpacktool নামে একটি সিমলিঙ্ক তৈরি করুন।

আপনার যদি wget থাকে:

computer:dir_to_avbtool$ wget https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

আপনার যদি curl থাকে :

computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

ওপেনএসএসএল

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

computer:~$ which openssl
/usr/bin/openssl

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

আপনার ডিভাইস থেকে এক্সট্র্যাক্ট করা 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

যদি আপনার ডিভাইসে Android System Key Verifier 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 মূলত এক বিশেষ ধরনের 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-এর মধ্যে কোড ট্রান্সপারেন্সি সিগনেচারটি খুঁজব। এটি APK থেকে এক্সট্র্যাক্ট করা অন্যান্য ফাইলগুলোর মধ্যে META-INF ফোল্ডারে থাকা code_transparency_signed.jwt নামের একটি ফাইল হওয়া উচিত।

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-এর মধ্যে থাকা কোড সিগনেচার টোকেনের সত্যতা যাচাই করা উচিত। এটি করার জন্য, আমরা bundletool এবং সেই কী-পেয়ারের (key pair) পাবলিক কী ব্যবহার করি যা দিয়ে এটিকে প্রথমে সাইন করা হয়েছে। এগুলি সংশ্লিষ্ট APK-গুলির প্রতিটি বিভাগের মধ্যে প্রকাশিত হয়। ধরে নিচ্ছি যে আপনি পাবলিক কী সার্টিফিকেটটি (যেমন অ্যান্ড্রয়েড সিস্টেম কী ভেরিফায়ারের জন্য) 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

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

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_1p_code

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

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

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