JavacDoor, Maven ম্যালওয়্যার যা কম্পাইল টাইমে চলে

JavacDoor: Maven-এর একটি আর্টিফ্যাক্ট যা ইনস্টলেশনের সময় নয়, কম্পাইলেশনের সময় চলত।

সুচিপত্র

অবশ্যই পঠনীয় পোস্ট

TL; ডিআর

Maven Central-এর একটি আর্টিফ্যাক্ট যা প্রকাশিত হয়েছে io.github.davidtimur:c2-lab নয়টি রিলিজ প্রকাশ করা হয়েছিল, যার মধ্যে আটটিতে এমন যেকোনো ডাউনস্ট্রিম প্রজেক্টের কম্পাইলেশনের সময় একটি রিমোট-অ্যাক্সেস পেলোড এক্সিকিউট করা হতো, যে প্রজেক্টটি জার ফাইলটিকে তার অ্যানোটেশন-প্রসেসর পাথে রাখত। কোনো অ্যাপ্লিকেশন কোডকে এটি ইম্পোর্ট করতে হতো না। সোর্স কোডের কোনো লাইনেও এটিকে রেফারেন্স করার প্রয়োজন ছিল না। টুলিংয়ের পরীক্ষা করার জন্য কোনো ইনস্টল স্ক্রিপ্ট, কোনো পোস্টইনস্টল সমতুল্য ব্যবস্থা, বা কোনো ধরনের লাইফসাইকেল হুক ছিল না।

এক্সিকিউশন ভেক্টর হলো জার ফাইলের ভেতরে থাকা একটি ৪৬-বাইটের ফাইল: এটি একটি জাভা সার্ভিস-প্রোভাইডার রেজিস্ট্রেশন যা একটি ইমপ্লিমেন্টিং ক্লাসের নাম উল্লেখ করে। javax.annotation.processing.Processorজাভা কম্পাইলার স্বয়ংক্রিয়ভাবে এই ধরনের নিবন্ধনগুলি খুঁজে বের করে। একবার খুঁজে পাওয়া গেলে, javac কম্পাইল করার একটি স্বাভাবিক অংশ হিসেবে ক্লাসটিকে ইনস্ট্যানশিয়েট করে এবং রান করে। এর মানে হলো, পেলোডের রানটাইম এনভায়রনমেন্ট হলো বিল্ড মেশিন, এবং এই মুহূর্তে বিল্ড মেশিনটি ঠিক সেই কাজটিই করছে যার জন্য তার অস্তিত্ব।

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

আর্টিফ্যাক্টটির নিজস্ব POM-এ "C2 Lab Payload" কথাটি এবং একটি MIT লাইসেন্স ছিল। আমরা পর্যবেক্ষণের পুরো সময়টা জুড়েই এটি Maven Central-এ লাইভ ছিল এবং এরপর থেকে এটি তার সম্পূর্ণ অংশসহ সরিয়ে ফেলা হয়েছে। io.github.davidtimur গ্রুপ।

গঠনতন্ত্র: নির্বাহক ইঞ্জিন হিসেবে কম্পাইলার

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

META-INF/services/javax.annotation.processing.Processor

প্রভাবিত প্রতিটি রিলিজে সেই ফাইলের বিষয়বস্তু হুবহু ও সম্পূর্ণভাবে নিচে দেওয়া হলো:

io.github.davidtimur.c2lab.C2Processor

ফাইলটি 1.0.1 থেকে 1.0.8 রিলিজ পর্যন্ত বাইটগতভাবে অভিন্ন, md5 7d2a08a5c8869a47eea9fa62487dfbe4. রিলিজ ১.০.০-তে এটি নেই।

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

প্যাটার্নট্রিগারদৃশ্যমান হিসাবে
npm ইনস্টল হুকnpm installscripts.postinstall ম্যানিফেস্টে
পাইথন ইম্পোর্ট-টাইম পেলোডমডিউলের প্রথম আমদানিসোর্সে মডিউল-স্তরের বিবৃতি
জাভাকডোরjavac যেকোনো ডাউনস্ট্রিম প্রকল্পেএকটি পরিষেবা-নিবন্ধনের ফাইলের নাম

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

পেলোড ক্লাসটি নিজেই শেলিং আউট করার মাধ্যমে হোস্ট রিকনেসান্স সম্পাদন করে। কম্পাইল করা ক্লাসগুলির কনস্ট্যান্ট পুলগুলিতে থাকে / বিন / SH, আমি কে, Uname-A, PWD ইউনিক্স পথে এবং কৃত কাজের তালিকা উইন্ডোজ পাথে, সাথে রিডাইরেক্টএররস্ট্রিম চাইল্ড প্রসেসের এরর আউটপুট ক্যাপচার করা স্ট্রিমে একীভূত করতে। দুটি JSON টেমপ্লেট হোস্টের বাইরে ফলাফল বহন করে — একটি রেজিস্ট্রেশন বীকন:

{"host":"%s","os":"%s","user":"%s","dir":"%s"}

জনবহুল থেকে হোস্ট-নেম কমান্ড এবং os.name, ব্যবহারকারীর নাম, এবং ব্যবহারকারী.ডির সিস্টেম প্রোপার্টিসমূহ, এবং একটি ফলাফল কলব্যাক:

{"version":"%s","host":"%s","time":"%s","output":"%s"}

কম্পাইলারের নিজস্ব আউটপুটে রেখে যাওয়া অগ্রগতির চিহ্নগুলো অস্বাভাবিকভাবে স্পষ্ট: [C2] কম্পাইল-টাইম এক্সিকিউশন সম্পন্ন, [C2] কলব্যাক পাঠানো হয়েছে → HTTP , [C2] শেল সংযুক্ত .

নয়টি রিলিজ, তিনটি C2 প্রজন্ম

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

মুক্তিকম্পাইল করার সময় স্বয়ংক্রিয়ভাবে কার্যকর হয়চ্যানেল
1.0.0না (কোন পরিষেবা ফাইল নেই)অপারেটর-প্রদত্ত কলব্যাক URL শুধুমাত্র
1.0.1হ্যাঁ (ভেক্টর প্রবর্তন করা হয়েছে)অপারেটর-প্রদত্ত কলব্যাক URL
1.0.2হাঁরিভার্স শেল, এনগ্রোক টিসিপি টানেল
1.0.3হাঁHTTP চ্যানেল, /register /cmd /out
1.0.4হাঁHTTP চ্যানেল, /register /cmd /out
1.0.5হাঁHTTP চ্যানেল, /register /poll /out
1.0.6হাঁHTTP চ্যানেল, /register /poll /out
1.0.7হাঁHTTP চ্যানেল, /register /cmd
1.0.8হাঁHTTP চ্যানেল + TLS যাচাইকরণ নিষ্ক্রিয় করা হয়েছে

ওই সারণিতে থাকা তিনটি বিষয় বিশদভাবে তুলে ধরা প্রয়োজন, কারণ এগুলোর প্রত্যেকটিই আর্টিফ্যাক্ট সেটটি কীভাবে পাঠ করা উচিত তা পরিবর্তন করে দেয়।

ভেক্টরটি 1.0.1-এ পৌঁছায়, 1.0.2-এ নয়। রিলিজ 1.0.0-এ একই রিকনসান্স এবং কলব্যাক লজিক রয়েছে, কিন্তু এতে কোনো সার্ভিস ফাইল এবং অ্যানোটেশন-প্রসেসিং ইম্পোর্ট নেই; এটি কেবল তখনই চলে যখন কেউ এটিকে কল করে। 1.0.1 থেকে সার্ভিস ফাইলটি উপস্থিত এবং কম্পাইল করা ক্লাসগুলো ইম্পোর্ট করে। javax.annotation.processing.SupportedSourceVersion১.০.০ এবং ১.০.২—এই দুটি চিহ্নিত রিলিজের তুলনা করে করা যেকোনো মূল্যায়ন সঠিকভাবে এই সিদ্ধান্তে পৌঁছায় যে কিছু একটা পরিবর্তিত হয়েছে, কিন্তু কোথায় পরিবর্তন হয়েছে তা ভুলভাবে চিহ্নিত করে।

রিভার্স শেলটি ঠিক একটি রিলিজেই বিদ্যমান থাকে। রিলিজ ১.০.২-এ রয়েছে 0.tcp.ngrok[.]ioলগ লাইন [C2] শেল 0.tcp.ngrok[.]io:19823-এর সাথে সংযুক্ত হয়েছে।একটি ইন্টারেক্টিভ ব্যানার সি২-শেলএবং একটি ফ্রেম টার্মিনেটর সমাপ্ত১.০.৩ এবং তার পরবর্তী রিলিজগুলোতে এগুলোর কোনোটিই নেই এবং এর পরিবর্তে এগুলো একটি HTTPS হোস্টে পৌঁছায়। শুধুমাত্র চিহ্নিত রিলিজগুলোর নাম উল্লেখ করে একটি টেকডাউন অনুরোধ করা হলে, তাতে একটি অচল TCP এন্ডপয়েন্টের কথা বলা হতো এবং পরবর্তী ছয়টি রিলিজে উপস্থিত সচল HTTP চ্যানেলটির কোনো উল্লেখ থাকত না।

চূড়ান্ত সংস্করণে ট্রান্সপোর্ট ভেরিফিকেশন বাদ দেওয়া হয়েছে। রিলিজ 1.0.8 একটি ক্লাস যোগ করে যা ইমপ্লিমেন্ট করে javax.net.ssl.X509TrustManager যার সার্টিফিকেট-যাচাই করার পদ্ধতিগুলো কিছুই করে না, একটি সর্বদা-সত্য হোস্টনেম যাচাইকারী যা এর মাধ্যমে নিবন্ধিত হয় setDefaultHostnameVerifier, এবং একটি ট্রাস্টঅল একটি রুটিন যা উভয়কেই JVM-এর ডিফল্ট হিসেবে ইনস্টল করে। এর ফলে, সেই কম্পাইলের বাকি অংশের জন্য, JVM যেকোনো হোস্টের যেকোনো সার্টিফিকেট গ্রহণ করে — শুধু পেলোডের নিজস্ব ট্র্যাফিকের জন্যই নয়, বরং এরপর বিল্ডটি TLS-এর মাধ্যমে যা কিছু করে, তার সবকিছুর জন্যও।

যেসব ছয়টি রিলিজে HTTP চ্যানেলটি ব্যবহৃত হয়, তার সবকটিতেই একটিমাত্র হোস্ট ফ্রন্টেনড থাকে: টেবিলফুল-ফারভর-ক্রেজড.এনগ্রোক-ফ্রি[.]ডেভপ্রতিটি অনুরোধের সাথে হেডারটি থাকে। ngrok-skip-browser-warningযা সেই মধ্যবর্তী পৃষ্ঠাটিকে দমন করে, যা বিনামূল্যের এনগ্রোক টানেলগুলো ব্রাউজারগুলিতে পরিবেশন করে। রিলিজভেদে পাথ সেট পরিবর্তিত হয় — /আউট 1.0.7-এ অদৃশ্য হয়ে যায়, এবং /cmd বিকল্পগুলির সাথে /পোল কিন্তু আয়োজক কখনো বদলায় না।

স্ব-বর্জন বলে

1.0.1 থেকে পরবর্তী প্রতিটি POM আর্টিফ্যাক্টটির নিজস্ব বিল্ডের জন্য একটি কম্পাইলার আর্গুমেন্ট সেট করে:

-প্রক:কিছুই না

ঐ ফ্ল্যাগটি অ্যানোটেশন প্রসেসিং নিষ্ক্রিয় করে। এখানে এর প্রভাব হলো প্রি।cise: যখন প্রসেসর ধারণকারী প্রজেক্টটি নিজেই কম্পাইল করা হয়, তখন প্রসেসরটি চলে না।

এই ফ্ল্যাগটির ব্যবহার সম্পূর্ণ সাধারণ। যে প্রজেক্টে একটি অ্যানোটেশন প্রসেসর অন্তর্ভুক্ত থাকে, সেটির প্রায়শই বুটস্ট্র্যাপের সময় নিজের উপর সেই প্রসেসরটি প্রয়োগ করা এড়ানোর প্রয়োজন হয়, এবং বিল্ড-টুলের ডকুমেন্টেশনে ঠিক এটাই সুপারিশ করা হয়। এককভাবে এটি কিছুই প্রমাণ করে না।

তবে, প্রসেসর যা করে তার সাথে একত্রে বিবেচনা করলে, এটি একটি নির্দিষ্ট অসামঞ্জস্যতা বর্ণনা করে: কোডটি সেই সমস্ত মেশিনে চলে যারা আর্টিফ্যাক্টটির বিপরীতে কম্পাইল করে, কিন্তু যে মেশিনটি আর্টিফ্যাক্টটি বিল্ড করে সেখানে চলে না। ফ্ল্যাগটি সেই একই রিলিজে দেখা যায় যেখানে সার্ভিস ফাইলটি চালু করা হয় — ১.০.১ — এবং এর পরবর্তী প্রতিটি রিলিজেও এটি থাকে। “যে রিলিজে কম্পাইল-টাইম এক্সিকিউশন শুরু হয়” এবং “যে রিলিজে স্থানীয়ভাবে কম্পাইল-টাইম এক্সিকিউশন বন্ধ করা হয়”-এর মধ্যেকার সম্পর্কটিই আর্টিফ্যাক্ট সেটের সবচেয়ে কার্যকর বিশ্লেষণমূলক সংকেত, এবং এটি কোনো কিছু ডিকম্পাইল না করেই একটি প্লেইন-টেক্সট POM-এ দেখা যায়।

আমরা প্রভাবটি লক্ষ্য করে সেখানেই থেমে যাই। আর্টিফ্যাক্টগুলোর মধ্যে এমন কিছুই নেই যা থেকে বোঝা যায় কেন ফ্ল্যাগটি সেট করা হয়েছিল।

মেটাডেটার আরও একটি অংশ উল্লেখ করার মতো, মূলত এর নিষ্পত্তির জন্যই। পিওএম (POM) প্রজেক্টটির নাম দিয়েছে “C2 Lab Payload”, এটিকে “C2 lab payload artifact” হিসেবে বর্ণনা করেছে এবং এমআইটি (MIT)-কে লাইসেন্স দিয়েছে। এই ধরনের স্ব-লেবেলিং কখনও কখনও একটি প্যাকেজ যে একটি গবেষণামূলক কাজ, তার প্রমাণ হিসেবে উপস্থাপন করা হয়।cisএকটি জীবন্ত হুমকির পরিবর্তে, এবং মাঝে মাঝে এই ব্যাখ্যাটি সঠিকও হয় — কোনো পৌঁছানো যায় এমন পরিকাঠামোবিহীন একটি ঘোষিত ক্যানারি এটি থেকে ভিন্ন একটি বিষয়। এটি এখানে প্রযোজ্য নয়। একটি পাবলিক রিপোজিটরিতে প্রকাশিত, যেকোনো গ্রাহকের নাগালের মধ্যে থাকা এবং নয়টি রিলিজ জুড়ে তিনবার পুনর্নির্মিত বহির্গামী পরিকাঠামোসহ একটি কার্যকরী ইমপ্লান্ট হলো একটি জীবন্ত সক্ষমতা, এর মেটাডেটা একে যে নামেই ডাকুক না কেন। যে মেশিনে এটি কম্পাইল করা হয়, সেখানে যা ঘটে, POM-এর নামটি তাতে কোনো পরিবর্তন আনে না।

নির্মাণ মেশিনের জন্য সূচক

যদি কোনো বিল্ড হোস্ট এই আর্টিফ্যাক্টটির বিপরীতে কম্পাইল করে, তবে এর প্রমাণ ডিস্কে একটি স্থায়ী ইমপ্লান্ট হিসেবে থাকার পরিবর্তে বিল্ড লগ এবং নেটওয়ার্ক টেলিমেট্রিতে থেকে যায় — পেলোডটি কম্পাইলার প্রসেসের ভিতরে চলে এবং এটির সাথেই এক্সিট করে।

জার বা স্থানীয় রিপোজিটরি ক্যাশে

  • META-INF/services/javax.annotation.processing.Processor নামকরণ io.github.davidtimur.c2lab.C2Processor
  • সার্ভিস ফাইল md5 7d2a08a5c8869a47eea9fa62487dfbe4
  • শ্রেণীসমূহ অধীনে io/github/davidtimur/c2lab/: C2Processor, C2Task, Taskএবং 1.0.8 সংস্করণে অভ্যন্তরীণ ক্লাস Task$1

বিল্ড আউটপুটে

  • [C2] compile-time execution complete
  • [C2] callback sent → HTTP
  • [C2] callback failed:
  • [C2] shell connected to
  • ইন্টারেক্টিভ ব্যানার c2-shellফ্রেম টার্মিনেটর __END__

প্রক্রিয়াধীন টেলিমেট্রি

  • javac অভিভাবক হিসেবে /bin/sh -c (ইউনিক্স) অথবা একটি উইন্ডোজ কমান্ড ইন্টারপ্রেটার
  • শিশুর আদেশ whoami, uname -a, pwd (ইউনিক্স) অথবা tasklist (উইন্ডোজ) একটি কম্পাইল ধাপ দ্বারা সূচিত

নেটওয়ার্ক টেলিমেট্রিতে

  • বহির্গামী TCP 0.tcp.ngrok[.]io:19823 (সংস্করণ ১.০.২)
  • HTTPS থেকে tableful-fervor-crazed.ngrok-free[.]dev, পথ /register, /cmd, /poll, /out (রিলিজ ১.০.৩ থেকে ১.০.৮)
  • অনুরোধ হেডার ngrok-skip-browser-warning: true
  • অনুরোধের সাথে মিলছে {"host":...,"os":...,"user":...,"dir":...} or {"version":...,"host":...,"time":...,"output":...}

কনফিগারেশনে

  • পরিবেশ পরিবর্তনশীল CALLBACK, CALLBACK_URLসিস্টেমের বৈশিষ্ট্য callback.url

প্রকাশক মেটাডেটা

  • গ্রুপ io.github.davidtimurপ্রকাশকের ঠিকানা davudboi999@gmail[.]comস্বাক্ষর করার চাবি E520C345EF94423D

যে বিল্ডে রিলিজ ১.০.৮ চালানো হয়েছে, সেটির জন্য একটি অতিরিক্ত যাচাই প্রয়োজন। যেহেতু ঐ রিলিজটি একটি শিথিল ট্রাস্ট ম্যানেজারকে JVM-ব্যাপী ডিফল্ট হিসেবে ইনস্টল করে, তাই একই JVM-এ পরবর্তীতে করা যেকোনো TLS সংযোগ — যেমন ডিপেন্ডেন্সি রেজোলিউশন, আর্টিফ্যাক্ট আপলোড, বা কোনো ডেপ্লয়মেন্ট ধাপ — সার্টিফিকেট যাচাই ছাড়াই সম্পন্ন হয়েছে। ঐ সময়কালের ট্র্যাফিককে প্রমাণীকৃত বলে ধরে নেওয়া উচিত নয়।

সংকলিত আর্টিফ্যাক্টগুলির কেন ভিন্ন স্ক্যানিং প্রয়োজন

JavacDoor একটি কার্যকরী টেস্ট কেস, কারণ এটি একই সাথে দুটি প্রচলিত ধারণাকে ভুল প্রমাণ করে এবং এই ব্যর্থতাগুলোর কোনোটিই কোনো একটি নির্দিষ্ট ভেন্ডরের টুলিংয়ের ক্ষেত্রে প্রযোজ্য নয়।

প্রথম ধারণাটি হলো, বিপজ্জনক কোড একটি ম্যানিফেস্টের মাধ্যমে নিজেকে প্রকাশ করে। সরবরাহ-শৃঙ্খলের বেশিরভাগ টুলিং জীবনচক্রকে কেন্দ্র করে সংগঠিত হয়। hooksকারণ npm এবং PyPI-এর ক্ষেত্রে সাধারণত সেখানেই মূল কার্যক্রম হয়ে থাকে। JavacDoor-এর কোনো হুক নেই। এর ট্রিগার হলো একটি সার্ভিস-রেজিস্ট্রেশন ফাইল, যার নাম একটি জাভা ইন্টারফেস এবং যার কন্টেন্ট হলো একটি ক্লাসের নাম। সেটিকে স্ট্যাটিক্যালি ধরার জন্য আপনাকে ট্রিট করতে হবে। META-INF/services/javax.annotation.processing.Processor নিজস্বভাবে একটি এক্সিকিউশন এন্ট্রি পয়েন্ট হিসাবে, এর সমতুল্য একটি পোস্টইনস্টল স্ক্রিপ্ট — এবং তারপর নির্দিষ্ট ক্লাসটিকে অনুসরণ করে বাইটকোডে প্রবেশ করুন। ইকোসিস্টেমগুলোর এই ধরনের নিজস্ব স্বয়ংক্রিয়-আবিষ্কার প্রক্রিয়া রয়েছে, এবং টুলিং সেটিকে একটি এন্ট্রি পয়েন্ট হিসেবে গণনা করুক বা না করুক, প্রতিটিই একটি এন্ট্রি পয়েন্ট।

দ্বিতীয় অনুমানটি হলো, স্ট্রিংগুলো সোর্স ফাইলে থাকে। একটি জার ফাইলের জন্য, এন্ডপয়েন্ট, শেল কমান্ড, JSON টেমপ্লেট এবং লগ মার্কার সবই কনস্ট্যান্ট পুলে থাকে। .শ্রেণী ফাইলগুলো। টেক্সট গ্রেপ করার টুল কিছুই খুঁজে পায় না — এর কারণ স্ট্রিংগুলো দুর্বোধ্য তা নয়, বরং সেগুলো একটি কাঠামোগত বাইনারি কন্টেইনারের মধ্যে থাকে যা একটি টেক্সট স্ক্যান পার্স করতে পারে না। এই পোস্টের প্রতিটি নেটওয়ার্ক ইন্ডিকেটর কনস্ট্যান্ট-পুল পার্সিং থেকে এসেছে। এদের মধ্যে একটি হলো একটি সম্পূর্ণ গঠিত। https:// একটি ক্লাস ফাইলের ভিতরে ইউআরএলটি খোলাখুলিভাবে রয়েছে; জার ফাইলের পাঠযোগ্য বিষয়বস্তু টেক্সট স্ক্যান করলেও এটি খুঁজে পাওয়া যাবে না। এখানে ভেদ করার মতো কোনো এনকোডিং নেই, কেবল পড়ার জন্য একটি কন্টেইনার ফরম্যাট রয়েছে।

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

যেসব টিম বর্তমানে মেভেন আর্টিফ্যাক্ট ব্যবহার করে, তাদের জন্য তিনটি বাস্তবসম্মত পদক্ষেপ নিচে দেওয়া হলো:

  • অ্যানোটেশন-প্রসেসর পাথটিকে একটি এক্সিকিউশন বাউন্ডারি হিসেবে বিবেচনা করুন। সেখানে থাকা ডিপেন্ডেন্সিগুলো আপনার বিল্ডে কোড রান করে। যেখানে একটি বিল্ডের অ্যানোটেশন প্রসেসিংয়ের প্রয়োজন হয় না, -প্রক:কিছুই না প্রতিরক্ষামূলকভাবে এটি ততটাই কার্যকর যতটা দৃশ্যত এখানে স্থানীয়ভাবে ছিল; যেখানে এটি কাজ করে, সেখানে কম্পাইল ক্লাসপাথ থেকে প্রসেসর সেটটি উত্তরাধিকারসূত্রে গ্রহণ না করে, সেটিকে স্পষ্টভাবে পিন করে দিন।
  • কম্পাইলার সাবপ্রসেসগুলোর লগ। যে কম্পাইল ধাপে শেল চালু হয়, তা বেশিরভাগ প্রোজেক্টের ক্ষেত্রেই একটি ব্যতিক্রমী ঘটনা এবং সহজেই এর জন্য অ্যালার্ট দেওয়া যায়।
  • মেটাডেটাকে সাক্ষ্য হিসেবে গণ্য করবেন না। প্যাকেজের নাম বা বিবরণে থাকা “Lab”, “test”, “payload”, এবং “PoC” পরিধির সীমা নয়। কিন্তু প্রবেশযোগ্যতা (reachability) এবং আচরণ (behavior) হলো পরিধির সীমা।

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

তথ্যসূত্র

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

sca-tools-software-composition-analysis-tools
আপনার সফটওয়্যারের ঝুঁকিগুলোকে অগ্রাধিকার দিন, প্রতিকার করুন এবং সুরক্ষিত করুন।
আপনার বিনামূল্যে অ্যাকাউন্টটি নিন।
কোন ক্রেডিট কার্ড প্রয়োজন নেই

আপনার সফটওয়্যার উন্নয়ন ও বিতরণ সুরক্ষিত করুন

Xygeni প্রোডাক্ট স্যুটের সাথে