CARGO-AUDITABLE(1) General Commands Manual CARGO-AUDITABLE(1)

cargo-auditable - تعبیه درخت وابستگی‌ها با قالب JSON در یک بخش پیونددهنده اختصاصی از فایل اجرایی کامپایل‌شده

cargo-auditable

اطلاع دقیق از نسخه‌های crateهای استفاده‌شده برای ساخت فایل اجرایی راست (Rust). حسابرسی و ممیزی باینری‌ها برای باگ‌های شناخته‌شده یا آسیب‌پذیری‌های امنیتی در محیط عملیاتی، در مقیاس وسیع و بدون نیاز به ثبت دستی اطلاعات.

این ابزار با تعبیه داده‌های مربوط به درخت وابستگی‌ها در قالب JSON درون یک بخش پیونددهنده (linker section) اختصاصی در فایل اجرایی کامپایل‌شده کار می‌کند.

سیستم‌های لینوکس، ویندوز و مک‌اواس رسماً پشتیبانی می‌شوند. سایر مقاصد ELF نیز باید کار کنند اما در CI آزمایش نشده‌اند. در حال حاضر WASM پشتیبانی نمی‌شود، اما از ارسال پچ‌ها استقبال می‌شود.

هدف نهایی این است که خود Cargo این اطلاعات را درون باینری‌ها کدگذاری کند. یک RFC برای پیاده‌سازی درون Cargo وجود دارد که این پروژه مسیر را برای آن هموار می‌کند: https://github.com/rust-lang/rfcs/pull/2801

ابزار cargo auditable با هر دستور Cargo کار می‌کند. تمام آرگومان‌ها بدون تغییر به cargo ارسال می‌شوند.

آیا این کار باعث حجیم شدن باینری من می‌شود؟

در یک کلام، خیر. لیست وابستگی‌های تعبیه‌شده حتی در درخت‌های وابستگی بزرگ با بیش از ۴۰۰ ورودی، کمتر از ۴ کیلوبایت فضا می‌گیرد. این مقدار معمولاً بین ۱/۱۰۰۰ تا ۱/۱۰۰۰۰ اندازه کل باینری است.

آیا می‌توان کاری کرد که cargo همیشه با cargo auditable بیلد کند؟

بله! برای مثال در Linux/macOS/etc این خط را به .bashrc خود اضافه کنید:

alias cargo="cargo auditable"

اگر از پوسته‌ای غیر از bash استفاده می‌کنید، یا ایجاد alias برایتان مقدور نیست، به این صفحه مراجعه کنید: https://github.com/rust-secure-code/cargo-auditable/blob/HEAD/REPLACING_CARGO.md

آیا ابزاری برای خواندن و استفاده از این داده‌ها وجود دارد؟

گزارش آسیب‌پذیری‌ها:


ابزار cargo audit نسخه 0.17.3 به بالا می‌تواند این داده‌ها را در باینری‌ها تشخیص دهد و آسیب‌پذیری‌ها را گزارش کند.
ابزار trivy نسخه 0.31.0 به بالا این داده‌ها را در باینری‌ها شناسایی کرده و آسیب‌پذیری‌ها را گزارش می‌دهد.

بازیابی فهرست وابستگی‌ها:


ابزار syft نسخه 0.53.0 به بالا پشتیبانی آزمایشی برای شناسایی این داده‌ها در باینری‌ها دارد. هنگام استفاده روی ایمیج‌ها یا پوشه‌ها، پشتیبانی حسابرسی راست باید با افزودن گزینه --catalogers all فعال شود.
ابزار rust-audit-info فهرست وابستگی‌ها را از باینری بازیابی کرده و آن را با فرمت JSON چاپ می‌کند.

این ابزار همچنین با ابزارهای موجود که Cargo.lock را از طریق مبدل JSON-to-TOML مصرف می‌کنند سازگار است. با این حال توصیه ما پشتیبانی مستقیم از این قالب است؛ ساختار آن بسیار ساده طراحی شده تا به راحتی تجزیه شود، حتی اگر زبان شما هنوز کتابخانه‌ای برای آن نداشته باشد.

آیا می‌توانم این داده‌ها را با ابزاری که با زبانی دیگر نوشته شده بخوانم؟

بله. فرمت داده‌ها برای سازگاری با سایر پیاده‌سازی‌ها طراحی شده است. در واقع، تجزیه آن در پایتون تنها به ۵ خط کد نیاز دارد. برای مستندات تجزیه داده‌ها ببینید: https://github.com/rust-secure-code/cargo-auditable/blob/HEAD/PARSING.md

فرمت دقیق داده‌ها چیست؟

فرمت داده‌ها توسط طرح‌واره JSON زیر شرح داده شده است: https://github.com/rust-secure-code/cargo-auditable/blob/HEAD/cargo-auditable.schema.json داده‌های JSON با الگوریتم Zlib فشرده شده و در یک بخش پیونددهنده به نام .dep-v0 قرار می‌گیرند.

در مورد پلتفرم‌های تعبیه‌شده (Embedded) چطور؟

در سیستم‌های نهفته که نمی‌توانید حتی یک بایت اضافه مصرف کنید، نباید هیچ چیزی به فایل اجرایی اضافه شود. در عوض باید هش هر فایل اجرایی را در یک پایگاه‌داده ذخیره کنید و آن هش را با Cargo.lock، نسخه کامپایلر، نسخه LLVM، تاریخ ساخت و غیره مرتبط سازید. این کار می‌تواند یک پلاگین عالی برای Cargo باشد. از آنجا که این کار با یک اسکریپت ۵ خطی شل قابل انجام است، نوشتن آن بر عهده خواننده گذاشته شده است.

آیا این کار بر بیلد‌های بازتولیدپذیر (Reproducible Builds) تأثیر می‌گذارد؟

قالب داده‌ها به گونه‌ای طراحی شده که بیلد‌های بازتولیدپذیر را مختل نکند. حاوی هیچ برچسب زمانی نیست و JSON تولیدشده مرتب شده است تا اطمینان حاصل شود بین کامپایل‌های مختلف یکسان است. در واقع این کار به بیلد‌های بازتولیدپذیر کمک می‌کند چون شما دقیقاً تمام نسخه‌های استفاده‌شده را می‌دانید.

آیا این اطلاعات حساسی را فاش می‌کند؟

خیر. تمامی URLها و مسیرهای فایل‌ها حذف (redact) می‌شوند، اما نام crateها و نسخه‌ها همان‌طور که هستند ثبت می‌شوند. در حال حاضر پیام‌های panic برنامه‌ها اطلاعات بیشتری از این فاش می‌کنند. همچنین احتمالاً از نظر قانونی ملزم به افشای استفاده از crateهای متن‌باز خاصی هستید زیرا مجوز MIT و بسیاری مجوزهای دیگر این را الزام می‌کنند.

آیا نسخه کامپایلر نیز ثبت می‌شود؟

خود کامپایلر به زودی شروع به تعبیه آن خواهد کرد. در نسخه‌های قدیمی‌تر هم‌اکنون در اطلاعات دیباگ موجود است. در یونیکس می‌توانید با اجرای strings your_executable | grep 'rustc version' آن را ببینید.

در مورد پیگیری نسخه‌های کتابخانه‌های C پیوندشده استاتیک چطور؟

پرسش خوبی است. در حال حاضر به شیوه مناسبی در دسترس نیستند. اضافه شدن آن در آینده بسیار خوب خواهد بود اما برای انتشار اولیه الزامی نیست. می‌توان آن را بعداً با حفظ سازگاری عقبرو اضافه کرد.

چه چیزی مانع ادغام این قابلیت در خود Cargo شده است؟

خود پروژه Cargo در حال حاضر در وضعیت انجماد ویژگی‌ها (feature freeze) قرار دارد.

0
اجرای موفق برنامه.
1
اجرای ناموفق برنامه.
101
برنامه دچار بحران (panic) شد.

ساخت پروژه به همراه فهرست وابستگی‌های تعبیه‌شده در باینری‌ها:
# cargo auditable build --release

Sergey "Shnatsel" Davidoff <shnatsel@gmail.com>