Він має такий великий вплив через давно відому слабкість API Win32.
Програми породжуються у Win32 за допомогою CreateProcess()
системного виклику. Його можна використовувати декількома способами. Люди, що походять з фонів Unix, Linux або OS / 2, зазвичай вважають це тим, що вони беруть два окремі аргументи, щоб програма (файл зображення) нерестована і командний хвіст перейшов до нового процесу, оскільки назви файлів та вектори аргументів / командні хвости - це дві окремі речі в API цих операційних систем. Але насправді системний виклик можна викликати в альтернативній формі з назвою програми та аргументами, збитими в одну велику рядок. CreateProcess()
спробує відокремити назву файлу програми від хвостової частини команди.
Проблема полягає в тому, що це робиться шляхом поступового розбиття рядка в твейн на кожному наступному символі пробілу, поки ліва частина не збігається з файлом або каталогом. Багато програм Win32 намагаються передати рядки, як C:\Program Files\Contoso\TakeOver.exe StackExchange.com
у системний виклик. Це запустить правильну програму - C:\Program Files\Contoso\TakeOver.exe
- з правим командним хвостом - StackExchange.com
- до тих пір, поки якийсь очевидно небезпечний чоловік не прийде і створить C:\Program
файл так само, як ви.
У цей момент системний виклик закінчується спробою запустити файл зображення програми C:\Program
з хвостиком команди Files\Contoso\TakeOver.exe StackExchange.com
. Небеса допоможе вам, якщо C:\Program
насправді є зображення програми, що виконується.
Це загальна слабкість, і вона стосується будь-якого імені файлу програми, що містить пробіли в поєднанні з будь-якою програмою, яка використовує One Big String для нерестування інших програм. Але найпоширеніший випадок, який стосується цього, - це всі програми, які перебувають під програмою, C:\Program Files\
і велика кількість програм Win32, які використовують підхід «Одна велика струна».
Занадто пізно змінювати API Win32. Це було пізно десятиліття тому. І Microsoft не може змінити всі програми, написані іншими людьми, які передають один великий рядок замість двох CreateProcess()
. Таким чином, Microsoft змушує Windows перевіряти на час входу користувача наявність C:\Program
та відображати попередження, яке ви бачите.
І, як бачите, в Win32 doco Microsoft є велике попередження "Безпека", яке повідомляє розробникам не писати програми за допомогою підходу One Big String, який існує вже кілька років.
Подальше читання