شبحی در کامپیوتر؛ ماجرای تروجان خالق یونیکس در قلب کامپایلر C

شبحی در کامپیوتر؛ ماجرای تروجان خالق یونیکس در قلب کامپایلر C
نفوذ تامپسون، ضعف نظارت بر کد ماشین را برجسته کرد. حتی اگر کد منبع کامپایلر بینقص نوشته شود، نسخهی باینری آن ممکن است دستکاری شده باشد. مانند مُهری جعلی که روی موم داغ گذاشته شود، یک کامپایلر آلوده هیچ ردپایی در کد منبع باقی نمیگذارد.
بازخوانی یک نفوذ؛ افسانه یا واقعیتی ترسناک؟
در کنفرانس «Southern California Linux Expo» در مارس ۲۰۲۳، تامپسون بهعنوان سخنران پایانی، سخنرانی جذابی دربارهی تلاش ۷۵ سالهی خود برای گردآوری احتمالاً بزرگترین مجموعهی موسیقی دیجیتال خصوصی دنیا ارائه داد که شامل جعبههای موسیقی قدیمی و پیانوی خودکار بود.
در بخش پرسش و پاسخ، یکی از حضار بهشوخی دربارهی سخنرانی جایزهی تورینگ پرسید: «آیا میتوانید بگویید امروز هم درِ پشتی در هر نسخه از GCC و لینوکس قرار دارد؟» تامپسون پاسخ داد:
فرض میکنم دربارهی مقالهی قدیمی من صحبت میکنید. نه، من هیچ درِ پشتیای ندارم. آن نفوذ با کنترل دقیق انجام شد، چون پیش از آن اشتباهات فاحشی رخ داده بود. من آن را منتشر کردم، یا به شکلی کنترلشده اجازه دادم کسی آن را از من بدزدد و سپس ردیابی کردم که آیا آن را پیدا میکنند یا نه.
[خوشبختانه] آنها موفق نشدند. به دلایل فنی، سیستم از کار افتاد و نتوانستند منشأ مشکل را تشخیص دهند؛ پس هرگز لو نرفت. در حضور این جمعیت باید بگویم که از زمانی که آن مقاله را نوشتم، منتظر این پرسش بودم: «کدش را هنوز داری؟» اما هیچکس نپرسید. من هنوز کد را نگه داشتهام.– کن تامپسون ، برنامهنویس ارشد (اسبق) یونیکس
در سپتامبر ۲۰۲۳، راس کاکس، مهندس نرمافزار برجسته و یکی از رهبران فنی اصلی تیم توسعه زبان برنامهنویسی Go، بلافاصله پس از تماشای ویدیو در یوتیوب، به تامپسون ایمیل زد و از او کد را خواست. پس از تأخیری ششماهه، تامپسون پاسخ داد که او بهعنوان اولین نفر، این درخواست را مطرح کرده است.
تامپسون فایلی به نام nih.a را برای کاکس ارسال کرد؛ نامی مرموز برای برنامهای مرموز. تامپسون بعدها تأیید کرد این نام مخفف «Not Invented Here» است؛ بهمعنی «اینجا اختراع نشده» برای اشاره به این طرز تفکر که افراد یا سازمانها به محصولات بیرونی بیاعتماد هستند. امروزه کامپایلرها معمولاً فایلهای .a را بهعنوان آرشیو دادهها تولید میکنند، اما فایل ارسالی تامپسون حاوی دو کد منبع قدیمی بود.
کد محتوای nih.a با کامپایلر C در نسخهی پنجم یونیکس (منتشرشده در ژوئن ۱۹۷۴) کار نمیکرد، زیرا آن زمان پیشپردازندهی C فقط فایلهایی را پردازش میکرد که با کاراکتر # شروع میشدند. درِ پشتی در پیشپردازنده قرار داشت و فایل cc.c در نسخهی پنجم با # شروع نمیشد، بنابراین نمیتوانست خود را اصلاح کند.
کاکس تلاش کرد با وصل کردن نقاط روشن ماجرا، از جمله تاریخهای تولید فایل nih.a، اصالت آن را تأیید کند
اما محتوای nih.a با کامپایلر C در نسخهی ششم سیستمعامل در دست توسعهی یونیکس سازگاری داشت. بنابراین کد ارسالی به دورهی یکساله بین ژوئن ۱۹۷۴ تا ژوئن ۱۹۷۵ تعلق داشت (احتمالاً اوایل ۱۹۷۵). کاکس یک شبیهساز آنلاین از برنامههای نسخهی ششم یونیکس ایجاد و آن را با فایلهای قدیمی از تامپسون و دنیس ریچی (از جمله nih.a) پر کرد تا کد را ردیابی کند.
اگرچه کد nih.a در نسخهی ششم یونیکس استفاده نشد، آرشیو nih.a زمان اصلاح هر فایل را ثبت کرده بود. با استفاده از سیستمهای مدرن یونیکس، میتوان این زمانبندی را مستقیماً از آرشیو استخراج کرد:
% hexdump -C nih.a
00000000 6d ff 78 2e 63 00 00 00 00 00 46 0a 6b 64 06 b6 |m.x.c…..F.kd..|
00000010 22 05 6e 69 68 66 6c 67 3b 0a 63 6f 64 65 6e 69 |”.nihflg;.codeni|
…
00000530 7d 0a 7d 0a 72 63 00 00 00 00 00 00 46 0a eb 5e |}.}.rc……F..^|
00000540 06 b6 8d 00 65 64 20 78 2e 63 0a 31 2c 24 73 2f |….ed x.c.1,$s/|
% date -r 0x0a46646b # BSD date. On Linux: date -d @$((0x0a46646b))
Thu Jun 19 00:49:47 EDT 1975
% date -r 0x0a465eeb
Thu Jun 19 00:26:19 EDT 1975
%
براساس گفتههای تامپسون در پرسش و پاسخ و روایتهای عمومی متعدد (گاه با جزئیات متناقض)، به نظر میرسد برنامهنویسان اولیهی یونیکس (Programmer’s Workbench یا PWB) نسخهی آلودهشده کامپایلر را کپی کردند. نهایتاً درِ پشتی به برنامهی login نیز راه یافت؛ اما گروه PWB متوجه شدند هر بار که کامپایلر خودش را کامپایل میکند، حجمش افزایش مییابد. درنهایت، آنها فرایند تکثیر را مختل کردند و کامپایلر پاکی به دست آوردند.
طبق گفتهی جان مَشِی، که در توسعه سیستمعامل UNIX و طراحی معماریهای RISC نقش داشته، نسخهی آلوده در آزمایشگاهای بل باقی ماند. همهی روایتها، بهجز یکی، تأیید میکنند کامپایلر آلوده، فراتر از آزمایشگاههای بل منتشر نشد. بااینحال، مقالهی اریک ریموند حاوی اطلاعاتی بود که بیان میداشت درِ پشتی login به بیرون از آزمایشگاههای بل نشت کرده بود. او خطاب به تامپسون نوشت:
سردبیر مقاله تامپسون، از دو گزارش جداگانه اطلاع یافت که نسخهی آلودهی login از آزمایشگاههای بل خارج شده و حداقل یک بار امکان ورود شبانه به شبکه را برای کاربری با نام «kt» فراهم کرده بود.
– اریک ریموند، برنامهنویس سیستمهای امنیتی
تامپسون ادعای ریموند را قویاً رد کرد و گفت از نظر فنی ممکن نبوده است، زیرا درِ پشتی فقط برای حسابهای موجود با رمز «codenih» کار میکرد؛ اما ماه هیچ وقت پشت ابر نمیماند.
سالها قبل (۱۹۹۷)، ریچی مجموعهای از نسخههای قدیمی نوارهای دادههای شخصی از زمان توسعهی یونیکس را به وارن تومی، مدیر آرشیو جامعهی میراث یونیکس (TUHS) اهدا کرده بود. در جولای ۲۰۲۳، تومی این مجموعه را در اینترنت منتشر کرد. یکی از نوارها، حاوی فایلهای قدیمی تامپسون بود، از جمله فایل nih.a با تاریخ ویرایش ۳ جولای ۱۹۷۵. گویا تامپسون نسخهای کمی متفاوت از nih.a را (با تاریخ ویرایش ۲۸ ژانویهی ۱۹۹۸) برای راس کاکس فرستاده بود؛ بازنویسی تاریخ!
برای مخاطبان کنجکاو: دادههای ریچی در این لینک قرار دارد. با کمی حوصله و وصل کردن نکاتی که خواندید، میتوانید به فایل nih.a دسترسی پیدا کنید. (راهنمایی: زمانی که هر دلار، ۳۰۲٫۷ یِن بود.)
ابعاد ترسناک «اعتماد به اعتماد»
در بطن نفوذ تامپسون، کابوس امنیت سایبری ترسناکی وجود دارد: «چگونه به چیزی اعتماد کنیم که نمیتوانیم ببینیم؟» برای ساخت نرمافزارهای امن، به ابزارهای قابلاعتماد نیاز دارید، اما اگر همان ابزارها نیز آلوده باشند، هر چیزی که را میسازند (حتی ابزارهای جدیدی که باید جایگزینشان شوند) آلوده میکنند. این چرخهای معیوب است که راه گریزی از آن نیست. فقط یک راهحل وجود دارد: برنامهنویس دیگری، کامپایلر C را از نو و با زبان اسمبلی بنویسد؛ اما آیا این بار به برنامهنویس جدید اعتماد دارید؟
بهطور خلاصه، با هر بار کامپایل، مشکل بهطور مداوم تکرار میشود. یک کامپایلر آلوده نهتنها برنامهها، بلکه کامپایلرهای آینده، سیستمعاملها و حتی ابزارهای امنیتی را نیز آلوده میکند. بازرسی کد منبع هم فایدهای ندارد، چون رخنه در باینری کامپایلر نهفته است.
آسیبپذیری login یونیکس، یک تئوری انتزاعی نیست. اکوسیستمهای نرمافزاری امروز به زنجیرههای تأمین گستردهای متکی هستند: کتابخانهها، فریمورکها و کامپایلرهایی که اغلب توسط کامپایلرها ساخته میشوند. نمونهی نزدیک به واقعیت در سال ۲۰۲۴، کتابخانهی XZ Utils بود که یک درِ پشتی در فرایند ساخت آن پنهان شده بود. امروزه مهاجمان نیازی به نفوذ مستقیم به هدف ندارند؛ کافی است ابزارهایی را که هدف به آنها وابستگی دارد، آلوده کنند.
منبع : زومیت