if ((( options == __WCLONE ) || (options == __WALL)) && (
currUid = 0))
retval = -EINVAL ;
- خب مشکل کجاس؟
+ توی if اگر نگاه کنیم، به جای == اشتباهی = گذاشته! اما خب این چه مشکلی ممکنه به وجود بیاره؟!
بیایم برگردیم به سال ۲۰۰۳. زمانی که کد اصلی و برنچ اصلی لینوکس توی دوجا وجود داشت. هردو با هم سینک بودن ولی.
هر کد که قراره تایید بشه و وارد کرنل بشه، یه کد بهش اختصاص میدادن و یه متن که فلانی اینو تایید کرده.
اما دیدن که توی یکیش یه کد هست که کد نه تایید شده نه توضیحات داره. یکمی واردش شدن و دیدن که عه! این کد یه مشکل داره! == به کار نبرده و = به کار برده.
یکمی دقت کنیم. uid یعنی user id. و توی لینوکس کاربرها آیدی دارن. آیدی کاربر روت، 0 هست. خب حدس زدیم پس این کد که درون یه تابع بود، درواقع id کاربر رو 0 میکنه یعنی دسترسی روت میده‼
درواقع اگر برنامهای این فانکشن رو از کرنل صدا بزنه، خود به خود توی if روت میشد و دسترسی روت پیدا میکرد؛ دسترسی روت بالاترین سطح دسترسی هست. یعنی درواقع تقریبا هر کاری میتونه با سیستم کنه.
بعدا مشخص شد که سرور رو هک کردن و این کد رو وارد کردن. این درواقع تلاشی بود برای واردکردن یه backdoor توی لینوکس! که البته ناموفق بود و معلوم نشد که کی این کار رو کرده
توضیح ساده بکدور: یه در پشتی که بتونن از طریق اون بدون اعتبارسنجی، به سیستم نفوذ کنن!
البته این کد هیچوقت وارد هسته اصلی لینوکس نشد و تاییدکنندگان کدها پیداش کردن!
[Src]