باگِ اسکنر رازهای مخفی ما که واچداگها (canaries) نتوانستند پیدایش کنند
ارسال
پیش از آنکه هر کیتی را که میفروشیم فشرده کنیم، یک دروازه (gate) آن را برای یافتن مقادیر واقعی رازهای خودمان اسکن میکند. هر اسکن با کاشتن واچداگها (canaries)، یکی از هر نوع، آغاز میشود و اجازه اجرا نمیدهد مگر آنکه همه آنها را بگیرد. همیشه آنها را میگرفت. اما هنوز یک باگ داشت.
دروازه چگونه رازها را میخواند
دروازه تنها به دنبال چیزهایی با شکل کلید نمیگردد. فایلهایی که رازهای ما در آنها زندگی میکنند (فایلهای env، تنظیمات JSON، فایلهای کلید) را میخواند، هر مقداری که نامش میگوید راز است را برمیدارد، و سپس آنچه میخواهیم ارسال کنیم را برای یافتن دقیقاً همان مقادیر، به همان شکل نوشتهشده و بهصورت base64-encoded، جستجو میکند.
باگ
برای خطی مانند این:
DB_PASSWORD='Tr0ub4dor-and-3' # چرخش در مه
خواننده (reader) تنها زمانی نقلقولهای اطراف را حذف میکرد که مقدار هم با کاراکتر نقلقول شروع شود و هم با آن تمام شود. وقتی پس از مقدار یک کامنت وجود داشت، خط با یک حرف تمام میشد، بنابراین نقلقولها باقی میماندند. کامنت در مرحله بعد حذف میشد و دروازه به جستجو برای 'Tr0ub4dor-and-3' ادامه میداد، نقلقولها هم شامل میشدند. کیتی که رمز عبور را بدون آن نقلقولها داشت، قبول میشد.
چرا واچداگها (canaries) هرگز متوجه نشدند
یک واچداگ (canary) یک تور را آزمایش میکند: مقداری که اسکنر از قبل میشناسد را بکارید، بررسی کنید که پیدا شود. مقادیر واچداگ (canary) ما مستقیماً به اسکنر داده میشدند، بنابراین هرگز از کدی که خط تنظیمات را میخواند عبور نمیکردند. همه تورها آزمایش شدند، اما پارسر (parser) جلوی آنها آزمایش نشد.
چگونه آن را پیدا کردیم
ما در حال تبدیل دروازه به یک محصول مستقل بودیم و تستی نوشتیم که یک فایل تنظیمات را به همان شکلهایی که مردم واقعاً مینویسند به آن میداد: export، نقلقولها، کامنتهای انتهایی. تست روی خطِ دارای نقلقول با کامنت شکست خورد. اصلاحشده، مقدارِ دارای نقلقول را تا نقلقولِ بستهکننده میخواند و هر چیزی که بعد از آن میآید را نادیده میگیرد.
آیا اهمیت داشت؟
پیش از تغییر هر چیزی بررسی کردیم. روی ماشین بیلد (build) ما، دروازه 133 مقدار راز مخفی از 59 فایلی که به آن داده میشود را میخواند، و روی ماشین دوم 499؛ هیچکدام آن شکل را نداشتند. هیچ رأی قبلی تغییر نمیکند: هر کیتی که منتشر کردهایم برای همان مقادیری اسکن شده که اکنون اسکن خواهد شد. با این حال، دروازه را روی هر سه ماشین اصلاح کردیم.
نکته کلیدی
اگر یک اسکنر آنچه را که جستجو میکند استخراج میکند، استخراج را با ورودی واقعی آزمایش کنید، نه فقط جستجو را با مقادیر از پیش تعیینشده. یک کاناری (Canary) ثابت میکند که تور کار میکند؛ اما چیزی درباره اینکه آیا ماهیهای درست هرگز به آن میرسند یا نه، نمیگوید. تستهای Secret Gate اکنون هر دو را پوشش میدهند و پیش از انتشار آن، بررسی کردیم که دقیقاً همان 133 مقدار را مانند گیت بیلد (build gate) ما میخواند.