2021-01-18 11:14:10
Иногда по нескольку раз возвращаюсь к какой-нибудь теме, даже самой пустяковой, потому что меня что-то беспокоит. В этот раз вспомнил об испорченном RC4 в Black Energy (та самая мальварь, которой валили электро-подстанции). Я напомню, что RC4 - потоковый шифр. Его внутреннее состояние - перестановка (задаваемая ключом) чисел от 0 до 255. for i in 0 .. 255: S[i] = i; for i in 0 .. 255: j = j + s[i] + k[i % keylen], swap(s[i], s[j]) Внутреннее состояние S, потом используется как генератор псевдослучайной последовательности: i++, j += s[i], swap(s[i], s[j]), return s[s[i] + s[j]]
У RC4 есть неприятная особенность - bias (перекос) во втором байте (и не только). Но во втором байте ноль встречается в два раза чаще, чем остальные значения. Кстати, если использовать алгоритм Фишера-Йейтса на полноразмерном двухкилобитном ключе или полностью случайную перестановку bias сохраняется. Что делает возможным целый ряд атак. Включая атаки на TLS и WPA. И хотя, соблюдая определенные меры предосторожности, из RC4 можно выжать капельку безопасности, делать этого не стоит.
RC4 уже сломан, он был сломан на следующий день после публикации реверса в cypherpunks, но по-прежнему завораживает кодеров своей простотой. Попытки изменить PRG приводят к тому, что новые фичи маскируют проблему, а не устраняют её полностью. Как сказал Мэт Грин, если вы будете бегать с ножницами вокруг бассейна, то может вы и не выколете себе глаз, но все-равно стоит напомнить о том, что беготня с ножницами не благословляется.
В Black Energy 2 генерация ключа испорчена весьма своеобразным способом. S[i] = i ⊕ key[i % keylen]. И я был немного невнимателен. Если бы эти "гении" использовали однобайтовый ключ, то i ⊕ const, выдал бы новую перестановку, похожий фокус вместе с циклической группой, afair, как-то использовал Mental Driller для псевдо-случайного (но при этом однократного) доступа к памяти в полиморфном расшифровщике. Смесь LCG и перестановки (для увеличения количества вариантов, не для "безопасности"). Но в BE ключ длинный. Я обратил внимание на то, что энтропия PRG упала, а все еще смешнее.
Сохранился и оригинальный bias во втором байте, и, что еще занятнее, состояние перестало быть перестановкой и мало того, что появились дополнительные перекосы, ослабляя шифр, так еще и нулевые байты в S, приводят к тому, что изрядная часть открытого текста остается незашифрованной, что вместе с key reuse (на это не обратил внимание только ленивый) приведёт к тому, что можно фигачить сигнатуры сразу на траффик.
В очередной раз, с грустью вынужден отметить, что высокое искусство вирусописательства в упадке. Люди, которые атакуют SCADA и занимаются международным терроризмом не в состоянии разобраться в том, как работает один из самых простых потоковых шифров и как правильно им пользоваться. Однако, если вместо Джеймса Бонда к вам вломился медведь размахивающий балалайкой, аки Пересвет копьем, это не делает его менее опасным. В критической инфраструктуре у нас уже мамаево поёбище, даже без медведей.
1.2K viewsedited 08:14