APK স্বাক্ষর স্কিম v2

APK স্বাক্ষর স্কিম v2 হল একটি সম্পূর্ণ-ফাইল স্বাক্ষর স্কিম যা যাচাইকরণের গতি বাড়ায় এবং APK-এর সুরক্ষিত অংশে কোনো পরিবর্তন শনাক্ত করে অখণ্ডতার গ্যারান্টি শক্তিশালী করে

APK স্বাক্ষর স্কিম v2 ব্যবহার করে স্বাক্ষর করা জিপ সেন্ট্রাল ডিরেক্টরি বিভাগের ঠিক আগে APK ফাইলে একটি APK সাইনিং ব্লক সন্নিবেশিত করে। APK সাইনিং ব্লকের ভিতরে, v2 স্বাক্ষর এবং স্বাক্ষরকারীর পরিচয় তথ্য একটি APK স্বাক্ষর স্কিম v2 ব্লকে সংরক্ষণ করা হয়।

স্বাক্ষর করার আগে এবং পরে APK

চিত্র 1. স্বাক্ষর করার আগে এবং পরে APK

Android 7.0 (Nougat) এ APK স্বাক্ষর স্কিম v2 চালু করা হয়েছিল। Android 6.0 (Marshmallow) এবং পুরানো ডিভাইসগুলিতে একটি APK ইনস্টলযোগ্য করতে, v2 স্কিমের সাথে স্বাক্ষর করার আগে APK-এ JAR স্বাক্ষর ব্যবহার করে স্বাক্ষর করা উচিত।

APK সাইনিং ব্লক

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

ব্লকটিতে আইডি-মানের জোড়া এমনভাবে মোড়ানো রয়েছে যা APK-এ ব্লকটি সনাক্ত করা সহজ করে তোলে। APK-এর v2 স্বাক্ষর আইডি 0x7109871a-এর সাথে একটি ID-মান পেয়ার হিসাবে সংরক্ষণ করা হয়।

বিন্যাস

APK সাইনিং ব্লকের বিন্যাসটি নিম্নরূপ (সমস্ত সংখ্যাসূচক ক্ষেত্র সামান্য-এন্ডিয়ান):

  • বাইটে size of block (এই ক্ষেত্র ব্যতীত) (uint64)
  • uint64-দৈর্ঘ্য-প্রিফিক্সড আইডি-মান জোড়ার ক্রম:
    • ID (uint32)
    • value (পরিবর্তনশীল-দৈর্ঘ্য: জোড়ার দৈর্ঘ্য - 4 বাইট)
  • বাইটে size of block -প্রথম ক্ষেত্রের মতোই (uint64)
  • magic "এপিকে সিগ ব্লক 42" (16 বাইট)

প্রথমে জিপ সেন্ট্রাল ডিরেক্টরির শুরু খোঁজার মাধ্যমে (ফাইলের শেষে সেন্ট্রাল ডিরেক্টরির রেকর্ডের ZIP এন্ড খুঁজে বের করে, তারপর রেকর্ড থেকে সেন্ট্রাল ডিরেক্টরির স্টার্ট অফসেট পড়া) দ্বারা APK পার্স করা হয়। magic মানটি নিশ্চিত করার একটি দ্রুত উপায় প্রদান করে যে সেন্ট্রাল ডিরেক্টরির আগে যা সম্ভবত APK সাইনিং ব্লক। size of block তারপর দক্ষতার সাথে ফাইলের ব্লকের শুরুতে নির্দেশ করে।

ব্লকটি ব্যাখ্যা করার সময় অজানা আইডি সহ ID-মান জোড়া উপেক্ষা করা উচিত।

APK স্বাক্ষর স্কিম v2 ব্লক

APK এক বা একাধিক স্বাক্ষরকারী/পরিচয় দ্বারা স্বাক্ষরিত, প্রতিটি একটি স্বাক্ষর কী দ্বারা প্রতিনিধিত্ব করা হয়। এই তথ্য একটি APK স্বাক্ষর স্কিম v2 ব্লক হিসাবে সংরক্ষণ করা হয়. প্রতিটি স্বাক্ষরকারীর জন্য, নিম্নলিখিত তথ্য সংরক্ষণ করা হয়:

  • (স্বাক্ষর অ্যালগরিদম, ডাইজেস্ট, স্বাক্ষর) টিপলস। APK-এর বিষয়বস্তুগুলির অখণ্ডতা যাচাই থেকে স্বাক্ষর যাচাইকরণকে দ্বিগুণ করতে ডাইজেস্ট সংরক্ষণ করা হয়।
  • X.509 শংসাপত্র চেইন স্বাক্ষরকারীর পরিচয় উপস্থাপন করে।
  • কী-মান জোড়া হিসাবে অতিরিক্ত বৈশিষ্ট্য।

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

বিন্যাস

APK স্বাক্ষর স্কিম v2 ব্লক আইডি 0x7109871a এর অধীনে APK সাইনিং ব্লকের মধ্যে সংরক্ষণ করা হয়।

APK স্বাক্ষর স্কিম v2 ব্লকের বিন্যাসটি নিম্নরূপ (সমস্ত সাংখ্যিক মান সামান্য-এন্ডিয়ান, সমস্ত দৈর্ঘ্য-প্রিফিক্সড ক্ষেত্র দৈর্ঘ্যের জন্য uint32 ব্যবহার করে):

  • দৈর্ঘ্য-প্রিফিক্সড signer দৈর্ঘ্য-প্রিফিক্সড ক্রম:
    • দৈর্ঘ্য-প্রিফিক্সড signed data :
      • দৈর্ঘ্য-প্রিফিক্সড digests দৈর্ঘ্য-প্রিফিক্সড ক্রম:
      • X.509 certificates দৈর্ঘ্য-প্রিফিক্সড ক্রম :
        • দৈর্ঘ্য-প্রিফিক্সড X.509 certificate (ASN.1 DER ফর্ম)
      • দৈর্ঘ্য-প্রিফিক্সড additional attributes দৈর্ঘ্য-প্রিফিক্সড ক্রম:
        • ID (uint32)
        • value (ভেরিয়েবল-দৈর্ঘ্য: অতিরিক্ত বৈশিষ্ট্যের দৈর্ঘ্য - 4 বাইট)
    • দৈর্ঘ্য-প্রিফিক্সড signatures দৈর্ঘ্য-প্রিফিক্সড ক্রম:
      • signature algorithm ID (uint32)
      • signed data উপরে দৈর্ঘ্য-প্রিফিক্সড signature
    • দৈর্ঘ্য-প্রিফিক্সড public key (SubjectPublicKeyInfo, ASN.1 DER ফর্ম)

স্বাক্ষর অ্যালগরিদম আইডি

  • 0x0101—SHA2-256 ডাইজেস্ট সহ RSASSA-PSS, SHA2-256 MGF1, লবণের 32 বাইট, ট্রেলার: 0xbc
  • 0x0102—SHA2-512 ডাইজেস্ট সহ RSASSA-PSS, SHA2-512 MGF1, লবণের 64 বাইট, ট্রেলার: 0xbc
  • SHA2-256 ডাইজেস্ট সহ 0x0103—RSASSA-PKCS1-v1_5। এটি এমন বিল্ড সিস্টেমের জন্য যার জন্য নির্ধারক স্বাক্ষর প্রয়োজন।
  • SHA2-512 ডাইজেস্ট সহ 0x0104—RSASSA-PKCS1-v1_5। এটি এমন বিল্ড সিস্টেমের জন্য যার জন্য নির্ধারক স্বাক্ষর প্রয়োজন।
  • SHA2-256 ডাইজেস্ট সহ 0x0201—ECDSA
  • SHA2-512 ডাইজেস্ট সহ 0x0202—ECDSA
  • 0x0301—SHA2-256 ডাইজেস্ট সহ DSA

উপরের সমস্ত স্বাক্ষর অ্যালগরিদমগুলি অ্যান্ড্রয়েড প্ল্যাটফর্ম দ্বারা সমর্থিত৷ সাইনিং টুল অ্যালগরিদমের একটি উপসেট সমর্থন করতে পারে।

সমর্থিত কী আকার এবং ইসি বক্ররেখা:

  • আরএসএ: 1024, 2048, 4096, 8192, 16384
  • EC: NIST P-256, P-384, P-521
  • DSA: 1024, 2048, 3072

অখণ্ডতা-সুরক্ষিত বিষয়বস্তু

APK বিষয়বস্তু সুরক্ষিত করার উদ্দেশ্যে, একটি APK চারটি বিভাগ নিয়ে গঠিত:

  1. জিপ এন্ট্রির বিষয়বস্তু (অফসেট 0 থেকে APK সাইনিং ব্লক শুরু হওয়া পর্যন্ত)
  2. APK সাইনিং ব্লক
  3. জিপ কেন্দ্রীয় ডিরেক্টরি
  4. সেন্ট্রাল ডিরেক্টরির জিপ শেষ

স্বাক্ষর করার পরে APK বিভাগগুলি

চিত্র 2. স্বাক্ষর করার পরে APK বিভাগগুলি

APK স্বাক্ষর স্কিম v2 বিভাগ 1, 3, 4, এবং বিভাগ 2 এর ভিতরে থাকা APK স্বাক্ষর স্কিম v2 ব্লকের signed data ব্লকের অখণ্ডতা রক্ষা করে।

সেকশন 1, 3, এবং 4-এর অখণ্ডতা signed data ব্লকে সংরক্ষিত তাদের বিষয়বস্তুর এক বা একাধিক ডাইজেস্ট দ্বারা সুরক্ষিত হয় যা এক বা একাধিক স্বাক্ষর দ্বারা সুরক্ষিত।

বিভাগ 1, 3, এবং 4 এর উপর ডাইজেস্ট নিম্নলিখিত হিসাবে গণনা করা হয়, একটি দ্বি-স্তরের মার্কেল গাছের অনুরূপ। প্রতিটি বিভাগ পরপর 1 MB (2 20 বাইট) খণ্ডে বিভক্ত। প্রতিটি বিভাগে শেষ খণ্ডটি ছোট হতে পারে। প্রতিটি খণ্ডের ডাইজেস্ট বাইট 0xa5 এর সংমিশ্রণ, বাইটে খণ্ডের দৈর্ঘ্য (লিটল-এন্ডিয়ান uint32) এবং খণ্ডের বিষয়বস্তুর উপর গণনা করা হয়। শীর্ষ-স্তরের ডাইজেস্ট বাইট 0x5a এর সংমিশ্রণ, খণ্ডের সংখ্যা (লিটল-এন্ডিয়ান uint32) এবং খণ্ডগুলিকে APK-এ যে ক্রমে উপস্থিত হয় সেভাবে খণ্ডগুলির হজমের সংমিশ্রণের উপর গণনা করা হয়। ডাইজেস্টকে সমান্তরাল করে গণনার গতি বাড়ানোর জন্য খণ্ডিত ফ্যাশনে গণনা করা হয়।

APK ডাইজেস্ট

চিত্র 3. APK ডাইজেস্ট

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

রোলব্যাক সুরক্ষা

একজন আক্রমণকারী Android প্ল্যাটফর্মে v2-স্বাক্ষরিত APK যাচাই করা v1-স্বাক্ষরিত APK হিসাবে যাচাই করার চেষ্টা করতে পারে যা v2-স্বাক্ষরিত APK যাচাইকরণ সমর্থন করে। এই আক্রমণ প্রশমিত করার জন্য, v2-স্বাক্ষরিত APKগুলি যেগুলি v1-স্বাক্ষরিতও তাদের META-INF/*.SF ফাইলগুলির প্রধান বিভাগে একটি X-Android-APK-সাইনড অ্যাট্রিবিউট থাকতে হবে৷ অ্যাট্রিবিউটের মান হল APK স্বাক্ষর স্কিম আইডিগুলির একটি কমা দ্বারা পৃথক করা সেট (এই স্কিমের ID হল 2)৷ v1 স্বাক্ষর যাচাই করার সময়, APK যাচাইকারীকে সেই APKগুলিকে প্রত্যাখ্যান করতে হবে যেগুলির APK স্বাক্ষর স্কিমের জন্য একটি স্বাক্ষর নেই যা যাচাইকারী এই সেট থেকে পছন্দ করে (যেমন, v2 স্কিম)। এই সুরক্ষা এই সত্যের উপর নির্ভর করে যে বিষয়বস্তু META-INF/*.SF ফাইলগুলি v1 স্বাক্ষর দ্বারা সুরক্ষিত। JAR স্বাক্ষরিত APK যাচাইকরণের বিভাগটি দেখুন।

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

প্রতিপাদন

Android 7.0 এবং পরবর্তী সংস্করণে, APKগুলিকে APK স্বাক্ষর স্কিম v2+ বা JAR সাইনিং (v1 স্কিম) অনুযায়ী যাচাই করা যেতে পারে। পুরানো প্ল্যাটফর্ম v2 স্বাক্ষর উপেক্ষা করে এবং শুধুমাত্র v1 স্বাক্ষর যাচাই করে।

APK স্বাক্ষর যাচাইকরণ প্রক্রিয়া

চিত্র 4. APK স্বাক্ষর যাচাইকরণ প্রক্রিয়া (লাল রঙে নতুন ধাপ)

APK স্বাক্ষর স্কিম v2 যাচাইকরণ

  1. APK সাইনিং ব্লক সনাক্ত করুন এবং যাচাই করুন যে:
    1. APK সাইনিং ব্লকের দুটি আকারের ক্ষেত্রে একই মান রয়েছে।
    2. জিপ সেন্ট্রাল ডিরেক্টরি অবিলম্বে সেন্ট্রাল ডিরেক্টরি রেকর্ডের জিপ এন্ড অনুসরণ করে।
    3. সেন্ট্রাল ডাইরেক্টরির জিপ এন্ডে বেশি ডেটা থাকে না।
  2. APK সাইনিং ব্লকের ভিতরে প্রথম APK স্বাক্ষর স্কিম v2 ব্লক খুঁজুন। যদি v2 ব্লক থাকে তাহলে, ধাপ 3 এ এগিয়ে যান। অন্যথায়, v1 স্কিম ব্যবহার করে APK যাচাই করতে ফিরে যান।
  3. APK স্বাক্ষর স্কিম v2 ব্লকের প্রতিটি signer জন্য:
    1. signatures থেকে শক্তিশালী সমর্থিত signature algorithm ID বেছে নিন। শক্তি ক্রম প্রতিটি বাস্তবায়ন/প্ল্যাটফর্ম সংস্করণ পর্যন্ত।
    2. public key ব্যবহার করে signed data বিপরীতে signatures থেকে সংশ্লিষ্ট signature যাচাই করুন। (এখন signed data পার্স করা নিরাপদ।)
    3. যাচাই করুন যে digests এবং signatures স্বাক্ষর অ্যালগরিদম আইডিগুলির অর্ডারকৃত তালিকা অভিন্ন৷ (এটি স্বাক্ষর স্ট্রিপিং/সংযোজন রোধ করার জন্য।)
    4. স্বাক্ষর অ্যালগরিদম দ্বারা ব্যবহৃত ডাইজেস্ট অ্যালগরিদমের মতো একই ডাইজেস্ট অ্যালগরিদম ব্যবহার করে APK বিষয়বস্তুর ডাইজেস্ট গণনা করুন
    5. যাচাই করুন যে গণনা করা ডাইজেস্ট digests থেকে সংশ্লিষ্ট digest সাথে অভিন্ন।
    6. certificates প্রথম certificate SubjectPublicKeyInfo public key এর সাথে অভিন্ন তা যাচাই করুন।
  4. যাচাই সফল হয় যদি কমপক্ষে একজন signer পাওয়া যায় এবং প্রতিটি প্রাপ্ত signer জন্য ধাপ 3 সফল হয়।

দ্রষ্টব্য : যদি ধাপ 3 বা 4-এ ব্যর্থতা দেখা দেয় তাহলে APK অবশ্যই v1 স্কিম ব্যবহার করে যাচাই করা উচিত নয়।

JAR-স্বাক্ষরিত APK যাচাইকরণ (v1 স্কিম)

JAR-স্বাক্ষর করা APK হল একটি প্রমিত স্বাক্ষরিত JAR , যাতে অবশ্যই META-INF/MANIFEST.MF-এ তালিকাভুক্ত এন্ট্রিগুলি থাকতে হবে এবং যেখানে সমস্ত এন্ট্রিগুলিকে অবশ্যই স্বাক্ষরকারীদের একই সেট দ্বারা স্বাক্ষর করতে হবে৷ এর অখণ্ডতা নিম্নরূপ যাচাই করা হয়:

  1. প্রতিটি স্বাক্ষরকারীকে একটি META-INF/<signer>.SF এবং META-INF/<signer>.(RSA|DSA|EC) JAR এন্ট্রি দ্বারা প্রতিনিধিত্ব করা হয়৷
  2. <signer>.(RSA|DSA|EC) হল একটি PKCS #7 CMS ContentInfo যার স্বাক্ষরিত ডেটা কাঠামো রয়েছে যার স্বাক্ষর <signer>.SF ফাইলে যাচাই করা হয়।
  3. <signer>.SF ফাইলটিতে META-INF/MANIFEST.MF-এর একটি সম্পূর্ণ-ফাইল ডাইজেস্ট রয়েছে এবং META-INF/MANIFEST.MF-এর প্রতিটি বিভাগের ডাইজেস্ট রয়েছে৷ MANIFEST.MF-এর সম্পূর্ণ-ফাইল ডাইজেস্ট যাচাই করা হয়েছে৷ যদি এটি ব্যর্থ হয়, প্রতিটি MANIFEST.MF বিভাগের ডাইজেস্ট পরিবর্তে যাচাই করা হয়৷
  4. META-INF/MANIFEST.MF তে রয়েছে, প্রতিটি অখণ্ডতা-সুরক্ষিত JAR এন্ট্রির জন্য, একটি অনুরূপভাবে নামযুক্ত বিভাগ যাতে এন্ট্রির অসঙ্কোচিত বিষয়বস্তুর ডাইজেস্ট থাকে। এই সব ডাইজেস্ট যাচাই করা হয়.
  5. APK যাচাইকরণ ব্যর্থ হয় যদি APK-এ JAR এন্ট্রি থাকে যা MANIFEST.MF-এ তালিকাভুক্ত নয় এবং JAR স্বাক্ষরের অংশ নয়।

এইভাবে সুরক্ষা চেইন হল <সাইনার>।(RSA|DSA|EC) -> <সাইনার>.SF -> MANIFEST.MF -> প্রতিটি অখণ্ডতা-সুরক্ষিত JAR এন্ট্রির বিষয়বস্তু।