Щоб заспокоїти кількох, я не знайшов помилку, спостерігаючи за подвигами, у мене немає підстав вважати, що він був використаний до розкриття (хоча, звичайно, не можу це виключити). Я не знайшов його, дивлячись і на bash
код коду.
Не можу сказати, що точно пам’ятаю свій порядок думок у той час.
Це більш-менш випливало з роздумів про деякі поведінки певного програмного забезпечення, які я вважаю небезпечними (поведінка, а не програмне забезпечення). Таку поведінку, яка змушує задуматися: це не здається гарною ідеєю .
У цьому випадку я розмірковував над загальною конфігурацією ssh, яка дозволяє передавати змінні середовища несанітизовані від клієнта за умови, що починається їх ім'я LC_
. Ідея полягає в тому, щоб люди могли продовжувати користуватися своєю мовою під час роботи ssh
з іншими машинами. Хороша ідея, поки ви не почнете розглядати, наскільки складне управління локалізацією особливо, коли UTF-8 введено в рівняння (і бачити, наскільки погано з ним обробляється багато програм).
Ще в липні 2014 року, я вже повідомляв вразливість в GLibC обробки локалізації , яка в поєднанні з цієї sshd
конфігурацією, а два інших небезпечного поведінкою на bash
оболонці
дозволено ( з перевіркою достовірності) хакери зламати GIT сервера при умови , що вони були в змозі завантажити файли там і bash
був використаний як оболонка входу користувача git unix (CVE-2014-0475).
Я думав, що це, мабуть, погана ідея використовувати bash
в якості оболонки для входу користувачів, що пропонують послуги через ssh, враховуючи, що це досить складна оболонка (коли все, що вам потрібно, просто розбирає дуже простий командний рядок) і успадкувала більшість помилок кш. Оскільки я вже виявив декілька проблем із bash
використанням у цьому контексті (для тлумачення ssh ForceCommand
s), мені було цікаво, чи там потенційно їх більше.
AcceptEnv LC_*
дозволяє будь-якій змінній, з імені якої починається, LC_
і я мав розпливчастий спогад, що bash
експортовані функції ( небезпечна, хоча й корисна на той час функція) використовували змінні середовища, ім'я яких було щось на зразок,
myfunction()
і мені було цікаво, чи не було там чогось цікавого подивитися.
Я збирався відкинути це на тій підставі, що найгірше, що можна було б зробити, - перезначити команду, яку називають, LC_something
що насправді не може бути проблемою, оскільки це не існуючі назви команд, але потім я почав цікавитись, як bash
імпортуються ці змінні середовища.
Що робити, якщо змінні викликалися, LC_foo;echo test; f()
наприклад? Тому я вирішив ближче познайомитися.
A:
$ env -i bash -c 'zzz() { :;}; export -f zzz; env'
[...]
zzz=() { :
}
виявив, що мій спогад був невірним в тому, що змінні називалися не myfunction()
але, але myfunction
(і це
значення починається з ()
).
І швидкий тест:
$ env 'true;echo test; f=() { :;}' bash -c :
test
bash: error importing function definition for `true;echo test; f'
підтвердив мою підозру, що ім'я змінної не було захищено, і код був оцінений при запуску .
Гірше, що ще гірше, цінність також не санітувалася:
$ env 'foo=() { :;}; echo test' bash -c :
test
Це означало, що будь-яка змінна середовище може бути векторною.
Тоді, коли я зрозумів масштаб проблеми, підтвердив, що він також може бути використаний і через HTTP ( HTTP_xxx
/ QUERYSTRING
... env vars), такі, як служби обробки пошти, пізніше DHCP (і, мабуть, довгий список), і повідомив про це (уважно) .