به گزارشasis: احتمالاً مقالهای پژوهشی امنیتی تحت عنوان «تزریق کاراکترهای کنترلی در بارکدهای یکبعدی برای به اشتباه اداختن برنامههای کد شده» شما را جذب نکند، اما عبارت BadBarcode توجه شما را جلب می کند. یک پژوهشگر امنیتی چینی به نام Hyperchem Ma در کنفرانس PacSec سال جاری میلادی این مقاله را ارائه کرده است.
این مقاله به سرعت توانست محبوبیت زیادی کسب کند. برای مثال تیترهایی از جمله «بارکدهای مسموم میتوانند علیه امنیت سامانهها استفاده شوند» و «بارکدهای سفارشی میتوانند منجر به نفوذ به رایانه شوند» در اخبار امنیتی دیده شده است.
بیایید نگاهی به اینکه یک بارکد بد چهچیزی میتواند باشد بیاندازیم. بنابریان میتوانید دریابید این مشکل تا چه حد خطرناک است.
یک مطالعه تک بعدی
این پژوهشگر امنیتی به بارکدهای به اصطلاح تک بعدی نظری انداخته است، همانهایی که شما آنها را معمولاً روی محصولات موجود در قفسه سوپرمارکت میبینید. این بارکد در یک خط اجرا شده، و از چپ به راست چاپ میشود.
دو نوع اصلی بارکدهای تک بعدی وجود دارد که به نامهای کد ۳۹ و کد ۱۲۸ شناخته شدهاند. نامهای آنها ترکیبی از تاریخچه و خاصیت آنها میباشد.
امروزه کد ۳۹ میتواند ۴۳ کاراکتر مختلف را ارائه کند اما در ابتدا، به ۴۰ کاراکتر محدود شده بود که از بین آنها نیز یکی به توقف/شروع اختصاص داشت. بنابراین به ۳۹(۱-۴۰) نامگذاری شده است.
کد ۱۲۸ میتواند ۱۰۸ نشانه را ارائه کند، که از آن بین، ۱۰۳ عدد کاراکترهای داده هستند، و ۳ نشانه کنترلی نیز وجود دارند که نشان میدهند کدام بایتهای داده توسط هر یک از ۱۰۳ کدینگ نمایش داده میشوند .
شما میتوانید نشانههای کنترلی و نشانههای داده را در یک بارکد ترکیب کنید که در آن نشانههای کنترل در نقش یک بیت مانند Caps Lock بر روی صفحه کلید عمل میکنند تا بین بخشهای مختلف مجموعه کاراکترهای اسکی (ASCII) تغییر وضعیت ایجاد شود. به طور خلاصه، کد ۱۲۸ میتواند تمام ۱۲۸ کاراکتر را در مجموعه ۷ بیتی ASCII شامل کاراکترهایی از قبیلCtrl-C ، Ctrl-M (برگرداندن عمل انجامشده ) و Ctrl-[ (خروج) ارایه کند.
صفحه کلید بارکد
دلیل این که موضوع اهمیت دارد این است که بیشتر بارکد خوانها به عنوان صفحه کلید plug and play پیادهسازی شدهاند.
بدینترتیب شما میتوانید به راحتی با خواندن از صفحهکلید، بارکدها را در برنامههایتان بخوانید. اکنون تصور کنید که برنامه شما بارکدهای کد ۳۹ را میخواند؛ احتمالاً فرض میکنید که ورودیها بارکدخوان شبه صفحه کلید، تنها شامل حروف A تا Z، ارقام ۰ تا ۹ و یکی از نشانگرهای -$%./+ میباشد.
بنابریان اگر برنامه شما با استفاده از یک کتابخانه برنامهنویسی نوشته شده باشد که مثلا ctrl+o را به عنوان میانبر بازکردن یک فایل و یا ctrl+R را به عنوان اجرا کردن برنامه استفاده میکند، نباید نگران این باشید که این کاراکترها یک بارکد را شامل شوند.کد ۳۹ آن کاراکترهارا پشتیبانی نمیکند، بنابراین آنها پدیدار نخواهند شد.
بنابراین شاید به طور ضمنی تمایل به اعتماد کردن به ورودیهای بارکدها داشته باشید. مثلاً زمانی را درنظر بگیرید که یک کاربر میخواهد یک محصول را در یکی از پایانههای بررسی قیمت، بررسی کند. اما اگر یک مشتری کلاهبردار با بارکد کد ۱۲۸ شناسهای ظاهر شود که چیزی مانند عبارت زیر را میخواند:
[Ctrl-R]CMD.EXE[Enter]DEL /Y /S C:\*.*[Enter]
در اینصورت بسیاری از بارکدخوانها هرگز نمیتوانند این عبارت را به عنوان یک بارکد معتبر شناخته، الگوریتم رمزگشایی مناسب را انتخاب کرده و کاراکترها را بازگردانند. در نتیجه برنامهی بارکد احتمالاً به مشکل برمیخورد.
دستور بالا پس از باز کردن یک پنجرهی ترمینال، همهی محتویات درایو C را پاک میکند! جایی که احتمالاً خود برنامهی بارکدخوان هم در آنجا نصب شده است.
ورودیهایتان را اعتبارسنجی کنید
به این ترتیب به نظر میرسد که اعتبارسنجی ورودیهای بارکد یک ایدهی خوب باشد و همینطور هم هست. به بیان دیگر شما خطی از ورودی را از اسکنر بارکد قبول میکنید اما اول از همه آن را بررسی میکنید.
اگر شما تنها انتظار رقم و عدد دارید، زمانی که حروف، علایم نگارشی یا کاراکترهای کنترل ظاهر میشوند. میتوانید به جای اینکه با ورودی نامتعارف و حتی خطرناکی پیشروید از پذیرش آن خودداری کنید .
به هرحال، این امر ممکن است به نوبه خود کافی نباشد زیرا سامانهعامل به خودی خود - و یا دستکم چیزی که آن را مدیر پنجره یا Window Manager می-نامیم- ممکن است قبل از اینکه الگوریتم اعتبارسنجی ورودی حتی فراخوانی شود کاراکترهای خاصی را فوراً یافته و بر روی آنها کاری را انجام دهد.
زمانی به مدیران پنجره نیاز است که چندین برنامه صفحه کلید و صفحه نمایش را به اشتراک میگذارند تا در این شرایط مطمئن شویم محتواهای درستی به هر برنامه رسیده و ارسال میشود. همچنین برای کنترل کلیدهایی که مستقیماً توسط خود مدیر پنجره استفاده میشوند مانند ALt+TAB در ویندوز.
بنابراین اگر میخواهید بارکدخوانهای برنامه را از دادههای فشردن کلید غیرمعمول و غیرمنتظره و حتی مخرب در یک بارکد محافظت کنید نیاز دارید تا با توابع برنامهنویسی سطح پایین سامانه آشنا باشید، چراکه در اینصورت پیش از اینکه مدیربرنامه کارش را شروع کند شما فشرده شدن کلید را بررسی کردهاید.
با این روش، شما میتوانید ایمنی و امنیت برنامههایی را که نیاز به پذیرش ورودیهایی از خروجیهای غیرقابل اطمینان دارند تامین کنید.
تعداد کثیری از بارکدهای دوبعدی نیز وجود دارند مانند ماتریس دادهها، که بهترین و شناختهشدهترین آنها QR است.
بارکد دوبعدی به شما اجازه ذخیره اطلاعات و دادههای بیشتر را در همان فضا میدهند؛ بنابراین آنها به طور گسترده مورد استفاده قرار گرفتهاند و به طور گستردهای نیز توسط بارکدخوانها پشتیبانی میشوند.
پرواضح است برنامههای پایه گذاری شده بر کد ۳۹ که فقط برای اعداد و ارقام برنامه ریزی شده اند شاید روزی با صدها بایت داده از کد QR روبرو شوند، چرا که نمیتوانید کنترل کنید چه چیزی در برابر بارکدخوان قرار میگیرد.
آنچه که باید انجام دهیم:
به طور خلاصه:
۱. همیشه ورودی را پیش از استفاده اعتبارسنجی کنید.
۲. همیشه در نظر داشته باشید که چقدر ورودیهای غیرقابل اطمینان ممکن است برروی سامانهعامل اصلی شما قبل از اینکه شما آن را ببینید اثر بگذارد.
۳. در نظر داشته باشید عملکرد ابزارهای ورودی تخصصی (مانندبارکد خوانها) میتواند طوری تغییر یابد تا مانند دستگاههای همه منظوره (همچون صفحهکلید) رفتار کنند.
۴. همیشه منتظر وقایع غیرمنتظره باشید!
ثبت نظر