আপস করা Gradle নির্ভরতা নিরাপত্তা ঝুঁকি তৈরি করে। একজন দূষিত অভিনেতা সম্ভাব্যভাবে বিল্ড প্রক্রিয়ায় একটি পরিবর্তিত নির্ভরতা ইনজেক্ট করতে পারে, উদাহরণস্বরূপ, নির্ভরতা রেজোলিউশনের সময় একজন ম্যান-ইন-দ্য-মিডল আক্রমণের মাধ্যমে।
যদি একটি বিল্ড নির্ভরতা (একটি লাইব্রেরি) আপস করা হয় তবে এটি আপনার অ্যাপ্লিকেশনটি একটি ডিভাইসে কার্যকর করার পদ্ধতিকে প্রভাবিত করতে পারে। যদি একটি প্লাগইন নির্ভরতা আপস করা হয়, এটি আপনার বিল্ড কাজ করার উপায় পরিবর্তন করতে পারে, অথবা এমনকি বিল্ড মেশিনে বাহ্যিক কমান্ড চালাতে পারে।
এটি প্রশমিত করতে, আপনি আপনার বিল্ডে নির্ভরতা যাচাইকরণ সক্ষম করতে পারেন।
লাইব্রেরি চেকসাম এবং স্বাক্ষর
লাইব্রেরি লেখকরা মেটাডেটার দুটি টুকরো সরবরাহ করতে পারে যা আপনি যে নির্ভরতাগুলি ডাউনলোড করছেন তার সত্যতা যাচাই করতে সহায়তা করতে পারে। আপনি কোন মান অনুমোদন করেন তা নির্দিষ্ট করতে gradle/verification-metadata.xml
নামে একটি ফাইল সংজ্ঞায়িত করুন৷ এতে থাকতে পারে:
চেকসাম - একটি আর্টিফ্যাক্টের একটি হ্যাশ যা আপনি যাচাই করতে ব্যবহার করতে পারেন যে পরিবহণের সময় আর্টিফ্যাক্টটি নষ্ট হয়নি। যদি চেকসামটি একটি বিশ্বস্ত উত্স থেকে পুনরুদ্ধার করা হয়, তবে এটি আপনাকে বলে যে আর্টিফ্যাক্টটি পরিবর্তিত হয়নি, ম্যান-ইন-দ্য-মিডল আক্রমণগুলি হ্রাস করে।
নেতিবাচক দিকটি হল, যেহেতু চেকসামগুলি আর্টিফ্যাক্টগুলি থেকে গণনা করা হয়, সেগুলি প্রতিটি প্রকাশের সাথে পরিবর্তিত হয়, যখনই আপনি সেগুলি আপগ্রেড করবেন তখনই আপনাকে
gradle/verification-metadata.xml
আপডেট করতে হবে৷স্বাক্ষর - নির্ভরতা ব্যবহারকারীদের একটি প্রদত্ত আর্টিফ্যাক্টের জন্য একটি পাবলিক কী নির্দিষ্ট করার অনুমতি দেয় যে এই আর্টিফ্যাক্টটি লাইব্রেরির লেখক দ্বারা তৈরি এবং স্বাক্ষরিত হয়েছে তা যাচাই করার জন্য যিনি সেই পাবলিক কীটির প্রমাণীকৃত মালিক৷ এটি লাইব্রেরি লেখকের জন্য আরও কাজ, কিন্তু যতক্ষণ না তাদের ব্যক্তিগত কী নিজেই আপস করা হয় না, স্বাক্ষর আপনাকে বলে যে গ্রন্থাগারটি বৈধ।
যদি লাইব্রেরি লেখক একই কী দিয়ে একটি আর্টিফ্যাক্টের প্রতিটি সংস্করণে স্বাক্ষর করেন, আপনি তাদের আপগ্রেড করার সময়
gradle/verification-metadata.xml
আপডেট করতে হবে না।
নির্ভরতা যাচাইকরণ সক্ষম করুন
Gradle নির্ভরতা যাচাইকরণ আপনার নির্মাণের সময় চেকসাম এবং স্বাক্ষরের তুলনা করে।
একটি gradle/verification-metadata.xml
ফাইল তৈরি করুন যাতে নিম্নলিখিতগুলি রয়েছে:
<?xml version="1.0" encoding="UTF-8"?>
<verification-metadata
xmlns="https://schema.gradle.org/dependency-verification"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.3.xsd">
<configuration>
<!-- verify .pom and .module files -->
<verify-metadata>true</verify-metadata>
<!-- verify .asc PGP files that come with the artifacts -->
<verify-signatures>true</verify-signatures>
<!-- use human readable keyring format -->
<keyring-format>armored</keyring-format>
<!-- read keys in a local file, fewer requests to network -->
<key-servers enabled="false">
<key-server uri="https://keyserver.ubuntu.com"/>
<key-server uri="https://keys.openpgp.org"/>
</key-servers>
</configuration>
<components>
</components>
</verification-metadata>
এটি একটি সূচনা পয়েন্ট হিসাবে কাজ করে এবং শীঘ্রই আপডেট করা হবে।
এটি কিভাবে বিল্ড পরিবর্তন করে তা দেখতে ./gradlew assembleDebug
চালান। আপনি যেমন বার্তা দেখতে পাবেন
* What went wrong:
Error resolving plugin [id: 'com.android.application', version: '8.7.3', apply: false]
> Dependency verification failed for configuration 'detachedConfiguration1'
One artifact failed verification: com.android.application.gradle.plugin-8.7.3.pom ...
This can indicate that a dependency has been compromised ...
Open this report for more details: .../dependency-verification-report.html
Gradle আপনাকে বলছে যে আপনি নির্ভরশীলতার সংস্করণগুলি নিয়ে যাচ্ছেন যা আপনি স্পষ্টভাবে অনুমোদন করেননি।
চেকসাম এবং স্বাক্ষর ডেটা বুটস্ট্র্যাপ করুন
আপনি প্রাথমিক সেট বিশ্বস্ত কী এবং উপাদান বুটস্ট্র্যাপ করতে পারেন। এই প্রক্রিয়াটি আপনার প্রকল্প দ্বারা ব্যবহৃত সমস্ত লাইব্রেরির জন্য বর্তমান স্বাক্ষর এবং চেকসাম সংগ্রহ করে।
রান করে প্রাথমিক মেটাডেটা তৈরি করুন
./gradlew --write-verification-metadata pgp,sha256 --export-keys help
এই কমান্ডটি গ্রেডলকে এই প্রকল্পে ব্যবহৃত সমস্ত নির্ভরতার জন্য PGP কী এবং ফলব্যাক চেকসামগুলির একটি তালিকা তৈরি করতে বলে। আপনি আপনার verification-metadata.xml-এ একটি পরিবর্তন দেখতে পাবেন যেমন কয়েকটি এন্ট্রি সহ:
<trusted-key id="8461EFA0E74ABAE010DE66994EB27DB2A3B88B8B">
<trusting group="androidx.activity"/>
</trusted-key>
এটি গ্র্যাডলকে বলে যে যদি এটি maven গ্রুপ androidx.activity
থেকে নির্ভরতা দেখে তবে এটি নিশ্চিত করবে যে সহগামী .asc ফাইলগুলি (ভান্ডারে সংরক্ষিত স্বাক্ষর) সেই কীটির সাথে মেলে।
বুটস্ট্র্যাপিং gradle/verification-keyring.keys
তৈরি করবে যাতে আপনার বিল্ড দ্বারা ব্যবহৃত সর্বজনীন PGP কী থাকে। আপনার সংস্করণ ট্র্যাকিং সিস্টেমে এই ফাইল দুটি চেক করুন. যেকোন ভবিষ্যত পরিবর্তন যা verification-metadata.xml
বা verification-keyring.keys
পরিবর্তন করে তা সাবধানে পর্যালোচনা করা উচিত।
বিশ্বস্ত কী থেকে স্ট্রিপ সংস্করণ
সাইনিং কী খুব কমই একটি লাইব্রেরির রিলিজের মধ্যে পরিবর্তিত হয়। gradle/verification-metadata.xml
ফাইলে তৈরি করা ডেটাতে সংস্করণের বিবরণ রয়েছে, যার অর্থ প্রতিটি নতুন নির্ভরতা সংস্করণের জন্য আপনাকে মূল তথ্য পুনরায় যোগ করতে হবে।
এটি এড়াতে, এবং নির্দিষ্ট করুন যে কীটি একটি লাইব্রেরির সমস্ত সংস্করণে প্রযোজ্য, সংস্করণের বৈশিষ্ট্যগুলি সরান।
অ্যান্ড্রয়েড স্টুডিও এডিটরে, বিশ্বস্ত কীগুলির জন্য সমস্ত সংস্করণ নির্দিষ্টকরণ প্রতিস্থাপন করতে নিয়মিত এক্সপ্রেশন ব্যবহার করে সম্পাদনা > খুঁজুন > প্রতিস্থাপন... ব্যবহার করুন।
- থেকে:
<trusted-key(.*) version=\".*\"/>
- প্রতি:
<trusted-key$1/>
অ্যান্ড্রয়েড স্টুডিও সিঙ্ক্রোনাইজেশন
এখনও অবধি, আপনার কমান্ড-লাইন বিল্ড কাজ করে, তবে আপনি যদি অ্যান্ড্রয়েড স্টুডিওতে সিঙ্ক্রোনাইজ করার চেষ্টা করেন তবে আপনি এর মতো ত্রুটিগুলি দেখতে পাবেন
A build operation failed.
Dependency verification failed for configuration ':app:detachedConfiguration3'
One artifact failed verification: gradle-8.10.2-src.zip (gradle:gradle:8.10.2) from repository Gradle distributions
If the artifacts are trustworthy, you will need to update the gradle/verification-metadata.xml file. For more on how to do this, please refer to https://docs.gradle.org/8.10.2/userguide/dependency_verification.html#sec:troubleshooting-verification in the Gradle documentation.
অ্যান্ড্রয়েড স্টুডিও গ্রেডল উত্সগুলি ডাউনলোড করতে চায় (অন্যান্য উত্স এবং ডক্স সহ)। এটি সংশোধন করার সবচেয়ে সহজ উপায় হল সমস্ত উৎস এবং জাভাডোকসকে বিশ্বাস করা। gradle/verification-metadata.xml
এ <trusted-artifacts>
যোগ করুন :
<verification-metadata ...>
<configuration>
<trusted-artifacts>
<trust file=".*-javadoc[.]jar" regex="true"/>
<trust file=".*-sources[.]jar" regex="true"/>
<trust group="gradle" name="gradle"/>
</trusted-artifacts>
...
</configuration>
</verification-metadata>
আপনার বিল্ড এখন কমান্ড লাইন এবং অ্যান্ড্রয়েড স্টুডিও থেকে সঠিকভাবে কাজ করবে।
,আপস করা Gradle নির্ভরতা নিরাপত্তা ঝুঁকি তৈরি করে। একজন দূষিত অভিনেতা সম্ভাব্যভাবে বিল্ড প্রক্রিয়ায় একটি পরিবর্তিত নির্ভরতা ইনজেক্ট করতে পারে, উদাহরণস্বরূপ, নির্ভরতা রেজোলিউশনের সময় একজন ম্যান-ইন-দ্য-মিডল আক্রমণের মাধ্যমে।
যদি একটি বিল্ড নির্ভরতা (একটি লাইব্রেরি) আপস করা হয় তবে এটি আপনার অ্যাপ্লিকেশনটি একটি ডিভাইসে কার্যকর করার পদ্ধতিকে প্রভাবিত করতে পারে। যদি একটি প্লাগইন নির্ভরতা আপস করা হয়, এটি আপনার বিল্ড কাজ করার উপায় পরিবর্তন করতে পারে, অথবা এমনকি বিল্ড মেশিনে বাহ্যিক কমান্ড চালাতে পারে।
এটি প্রশমিত করতে, আপনি আপনার বিল্ডে নির্ভরতা যাচাইকরণ সক্ষম করতে পারেন।
লাইব্রেরি চেকসাম এবং স্বাক্ষর
লাইব্রেরি লেখকরা মেটাডেটার দুটি টুকরো সরবরাহ করতে পারে যা আপনি যে নির্ভরতাগুলি ডাউনলোড করছেন তার সত্যতা যাচাই করতে সহায়তা করতে পারে। আপনি কোন মান অনুমোদন করেন তা নির্দিষ্ট করতে gradle/verification-metadata.xml
নামে একটি ফাইল সংজ্ঞায়িত করুন৷ এতে থাকতে পারে:
চেকসাম - একটি আর্টিফ্যাক্টের একটি হ্যাশ যা আপনি যাচাই করতে ব্যবহার করতে পারেন যে পরিবহণের সময় আর্টিফ্যাক্টটি নষ্ট হয়নি। যদি চেকসামটি একটি বিশ্বস্ত উত্স থেকে পুনরুদ্ধার করা হয়, তবে এটি আপনাকে বলে যে আর্টিফ্যাক্টটি পরিবর্তিত হয়নি, ম্যান-ইন-দ্য-মিডল আক্রমণগুলি হ্রাস করে।
নেতিবাচক দিকটি হল, যেহেতু চেকসামগুলি আর্টিফ্যাক্টগুলি থেকে গণনা করা হয়, সেগুলি প্রতিটি প্রকাশের সাথে পরিবর্তিত হয়, যখনই আপনি সেগুলি আপগ্রেড করবেন তখনই আপনাকে
gradle/verification-metadata.xml
আপডেট করতে হবে৷স্বাক্ষর - নির্ভরতা ব্যবহারকারীদের একটি প্রদত্ত আর্টিফ্যাক্টের জন্য একটি পাবলিক কী নির্দিষ্ট করার অনুমতি দেয় যে এই আর্টিফ্যাক্টটি লাইব্রেরির লেখক দ্বারা তৈরি এবং স্বাক্ষরিত হয়েছে তা যাচাই করার জন্য যিনি সেই পাবলিক কীটির প্রমাণীকৃত মালিক৷ এটি লাইব্রেরি লেখকের জন্য আরও কাজ, কিন্তু যতক্ষণ না তাদের ব্যক্তিগত কী নিজেই আপস করা হয় না, স্বাক্ষর আপনাকে বলে যে গ্রন্থাগারটি বৈধ।
যদি লাইব্রেরি লেখক একই কী দিয়ে একটি আর্টিফ্যাক্টের প্রতিটি সংস্করণে স্বাক্ষর করেন, আপনি তাদের আপগ্রেড করার সময়
gradle/verification-metadata.xml
আপডেট করতে হবে না।
নির্ভরতা যাচাইকরণ সক্ষম করুন
Gradle নির্ভরতা যাচাইকরণ আপনার নির্মাণের সময় চেকসাম এবং স্বাক্ষরের তুলনা করে।
একটি gradle/verification-metadata.xml
ফাইল তৈরি করুন যাতে নিম্নলিখিতগুলি রয়েছে:
<?xml version="1.0" encoding="UTF-8"?>
<verification-metadata
xmlns="https://schema.gradle.org/dependency-verification"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.3.xsd">
<configuration>
<!-- verify .pom and .module files -->
<verify-metadata>true</verify-metadata>
<!-- verify .asc PGP files that come with the artifacts -->
<verify-signatures>true</verify-signatures>
<!-- use human readable keyring format -->
<keyring-format>armored</keyring-format>
<!-- read keys in a local file, fewer requests to network -->
<key-servers enabled="false">
<key-server uri="https://keyserver.ubuntu.com"/>
<key-server uri="https://keys.openpgp.org"/>
</key-servers>
</configuration>
<components>
</components>
</verification-metadata>
এটি একটি সূচনা পয়েন্ট হিসাবে কাজ করে এবং শীঘ্রই আপডেট করা হবে।
এটি কিভাবে বিল্ড পরিবর্তন করে তা দেখতে ./gradlew assembleDebug
চালান। আপনি যেমন বার্তা দেখতে পাবেন
* What went wrong:
Error resolving plugin [id: 'com.android.application', version: '8.7.3', apply: false]
> Dependency verification failed for configuration 'detachedConfiguration1'
One artifact failed verification: com.android.application.gradle.plugin-8.7.3.pom ...
This can indicate that a dependency has been compromised ...
Open this report for more details: .../dependency-verification-report.html
Gradle আপনাকে বলছে যে আপনি নির্ভরশীলতার সংস্করণগুলি নিয়ে যাচ্ছেন যা আপনি স্পষ্টভাবে অনুমোদন করেননি।
চেকসাম এবং স্বাক্ষর ডেটা বুটস্ট্র্যাপ করুন
আপনি প্রাথমিক সেট বিশ্বস্ত কী এবং উপাদান বুটস্ট্র্যাপ করতে পারেন। এই প্রক্রিয়াটি আপনার প্রকল্প দ্বারা ব্যবহৃত সমস্ত লাইব্রেরির জন্য বর্তমান স্বাক্ষর এবং চেকসাম সংগ্রহ করে।
রান করে প্রাথমিক মেটাডেটা তৈরি করুন
./gradlew --write-verification-metadata pgp,sha256 --export-keys help
এই কমান্ডটি গ্রেডলকে এই প্রকল্পে ব্যবহৃত সমস্ত নির্ভরতার জন্য PGP কী এবং ফলব্যাক চেকসামগুলির একটি তালিকা তৈরি করতে বলে। আপনি আপনার verification-metadata.xml-এ একটি পরিবর্তন দেখতে পাবেন যেমন কয়েকটি এন্ট্রি সহ:
<trusted-key id="8461EFA0E74ABAE010DE66994EB27DB2A3B88B8B">
<trusting group="androidx.activity"/>
</trusted-key>
এটি গ্র্যাডলকে বলে যে যদি এটি maven গ্রুপ androidx.activity
থেকে নির্ভরতা দেখে তবে এটি নিশ্চিত করবে যে সহগামী .asc ফাইলগুলি (ভান্ডারে সংরক্ষিত স্বাক্ষর) সেই কীটির সাথে মেলে।
বুটস্ট্র্যাপিং gradle/verification-keyring.keys
তৈরি করবে যাতে আপনার বিল্ড দ্বারা ব্যবহৃত সর্বজনীন PGP কী থাকে। আপনার সংস্করণ ট্র্যাকিং সিস্টেমে এই ফাইল দুটি চেক করুন. যেকোন ভবিষ্যত পরিবর্তন যা verification-metadata.xml
বা verification-keyring.keys
পরিবর্তন করে তা সাবধানে পর্যালোচনা করা উচিত।
বিশ্বস্ত কী থেকে স্ট্রিপ সংস্করণ
সাইনিং কী খুব কমই একটি লাইব্রেরির রিলিজের মধ্যে পরিবর্তিত হয়। gradle/verification-metadata.xml
ফাইলে তৈরি করা ডেটাতে সংস্করণের বিবরণ রয়েছে, যার অর্থ প্রতিটি নতুন নির্ভরতা সংস্করণের জন্য আপনাকে মূল তথ্য পুনরায় যোগ করতে হবে।
এটি এড়াতে, এবং নির্দিষ্ট করুন যে কীটি একটি লাইব্রেরির সমস্ত সংস্করণে প্রযোজ্য, সংস্করণের বৈশিষ্ট্যগুলি সরান।
অ্যান্ড্রয়েড স্টুডিও এডিটরে, বিশ্বস্ত কীগুলির জন্য সমস্ত সংস্করণ নির্দিষ্টকরণ প্রতিস্থাপন করতে নিয়মিত এক্সপ্রেশন ব্যবহার করে সম্পাদনা > খুঁজুন > প্রতিস্থাপন... ব্যবহার করুন।
- থেকে:
<trusted-key(.*) version=\".*\"/>
- প্রতি:
<trusted-key$1/>
অ্যান্ড্রয়েড স্টুডিও সিঙ্ক্রোনাইজেশন
এখনও অবধি, আপনার কমান্ড-লাইন বিল্ড কাজ করে, তবে আপনি যদি অ্যান্ড্রয়েড স্টুডিওতে সিঙ্ক্রোনাইজ করার চেষ্টা করেন তবে আপনি এর মতো ত্রুটিগুলি দেখতে পাবেন
A build operation failed.
Dependency verification failed for configuration ':app:detachedConfiguration3'
One artifact failed verification: gradle-8.10.2-src.zip (gradle:gradle:8.10.2) from repository Gradle distributions
If the artifacts are trustworthy, you will need to update the gradle/verification-metadata.xml file. For more on how to do this, please refer to https://docs.gradle.org/8.10.2/userguide/dependency_verification.html#sec:troubleshooting-verification in the Gradle documentation.
অ্যান্ড্রয়েড স্টুডিও গ্রেডল উত্সগুলি ডাউনলোড করতে চায় (অন্যান্য উত্স এবং ডক্স সহ)। এটি সংশোধন করার সবচেয়ে সহজ উপায় হল সমস্ত উৎস এবং জাভাডোকসকে বিশ্বাস করা। gradle/verification-metadata.xml
এ <trusted-artifacts>
যোগ করুন :
<verification-metadata ...>
<configuration>
<trusted-artifacts>
<trust file=".*-javadoc[.]jar" regex="true"/>
<trust file=".*-sources[.]jar" regex="true"/>
<trust group="gradle" name="gradle"/>
</trusted-artifacts>
...
</configuration>
</verification-metadata>
আপনার বিল্ড এখন কমান্ড লাইন এবং অ্যান্ড্রয়েড স্টুডিও থেকে সঠিকভাবে কাজ করবে।