الطرفية لما تستقبل حرف تطبعه لكن مع بعض المدخلات كالإشارة التي تأتي من الزر Escape/Échap تقوم الطرفية بالقيام بحدث ما وليس الطباعة.
هذا مثال يوضح المقصود:
$ printf '#!/bin/bash\necho doing something evil!\nexit\n\033[2Aecho doing something very nice!\n' > backdoor.sh
$ chmod +x backdoor.sh
$ cat backdoor.sh
#!/bin/bash
echo doing something very nice!
$ ./backdoor.sh
doing something evil!
نفذ الأوامر السابقة بالترتيب، هل تلاحظ ماذا حدث؟ هذا ليس مفترض أن يحدث.
هذا حدث لأن الـ Escape الموضوعة في أول أمر (\033[2A) تقوم بتحريك المؤشر للأعلى بـ X مرات (X=2) كاتبة على السطور الـ X. الطرفية لم تعرض تلك السلسلة من الحروف فهي قامت بعمل حدث. و هذا يمكن أن يؤثر على برامج كثيرة.
يمكنك تصور ماذا يمكن أن يفعل هذا مع إدخال الأمر wget أو برنامج Code Generator، هذا مثال توليد كود C:
$ printf '#include <stdio.h>\n\nint main()\n{\n\tprintf("doing something evil\\n");\n\t/*\033[2A\n\t/* This simple program doesnt do much... */\n\tprintf("doing something very nice\\n");\n\treturn 0;\n}\n' > nice.c
$ cat nice.c
#include <stdio.h>
int main()
{
/* This simple program doesnt do much... */
printf("doing something very nice\n");
return 0;
}
$ gcc nice.c
$ ./a.out
doing something evil
doing something very nice
لما تنفذ الأمر cat لا يخرج لك محتوى الملف الحقيقي، جرب فتحه لاحقا بمحرر خارجي مثل Gedit أو Kate أو من سطر الأوامر عبر less لكن ليس less -r nice.c
يمكنك قراءة المزيد في الرابط:
التعليقات