подделка пакетов
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.01.18 19:14
Оценка:
привет!

в некотором проекте я реализовал RMI, транспортная часть которого использует libsodium.
для обмена ключами используется функции из раздела Diffie-Hellman из libsodium.
для шифрования/дешифрования используются функции AEAD crypto_secretbox_easy() и crypto_secretbox_open_easy() отсюда.

все работает как надо, за исключением того момента, что иногда в теле пакетов приходит мусор, типа того, что я привел в своей соседней теме
Автор: niXman
Дата: 10.01.18
.

и тут меня смущает то, что функция crypto_secretbox_open_easy() успешно расшифровывает этот "плохой" пакет, значит, этот пакет был "испорчен" до применения к нему crypto_secretbox_easy(), которая, собственно и шифрует этот пакет и добавляет к нему тэг аутентификации(на противоположной стороне).

такие пакеты я ловил всего два раза. это очень редко, потому что этот код работает уже около полугода.
еще странность в том, что у пира приславшего этот пакет невозможно получить IP адрес, что похоже на SYN-flood атаку.

по поводу "подделки" пакетов перед шифрованием, я думаю, это можно сделать путем подмены msvcrt`шной функции memcpy(). но как с этим бороться? написать свою, хоть и не самую быструю реализацию этой функции(с инлайном етц..)?

глобальный вопрос: как защититься?


спасибо.


зы
клиенты — на венде, компилятор — MinGW-W64.
сервер — линукс.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 10.01.2018 19:16 niXman . Предыдущая версия . Еще …
Отредактировано 10.01.2018 19:16 niXman . Предыдущая версия .
Re: подделка пакетов
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.01.18 19:25
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>такие пакеты я ловил всего два раза. это очень редко, потому что этот код работает уже около полугода.

X>еще странность в том, что у пира приславшего этот пакет невозможно получить IP адрес, что похоже на SYN-flood атаку.

Ты что-то глобально путаешь. При SYN flood вообще соединение не устанавливается. А если прошёл TCP handshake (TCP ведь?), то адрес другой стороны известен. Даже если его эмулирует ближайший раутер.

Невозможно получить IP — может быть следствием того, что отправитель прислал RST. Тогда сам виноват, что не получил адрес ещё в accept(), а ждал возможности сделать getpeername() когда-нибудь потом.

А вот атака с подделкой sequence numbers — тут вполне возможна. Тогда ты видишь её состоявшийся вариант. Но скорее таки локальный взлом клиента.

X>по поводу "подделки" пакетов перед шифрованием, я думаю, это можно сделать путем подмены msvcrt`шной функции memcpy(). но как с этим бороться? написать свою, хоть и не самую быструю реализацию этой функции(с инлайном етц..)?


И как ты собрался лечить этим удалённого клиента?

X>глобальный вопрос: как защититься?


Например, message sequence numbers внутри потока (и тогда они тоже шифруются). После этого успешно расшифровать поддельный TCP уже не сможешь; а если смог — то ремотная программа взломана и вопрос именно в этом.
The God is real, unless declared integer.
Re[2]: подделка пакетов
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.01.18 19:45
Оценка:
Здравствуйте, netch80, Вы писали:

N>Ты что-то глобально путаешь. При SYN flood вообще соединение не устанавливается. А если прошёл TCP handshake (TCP ведь?), то адрес другой стороны известен. Даже если его эмулирует ближайший раутер.

похоже, ты прав...

N>Невозможно получить IP — может быть следствием того, что отправитель прислал RST. Тогда сам виноват, что не получил адрес ещё в accept(), а ждал возможности сделать getpeername() когда-нибудь потом.

кстати да, вариант...

N>А вот атака с подделкой sequence numbers — тут вполне возможна.

о чем речь?

N>И как ты собрался лечить этим удалённого клиента?

клиенты в этом проекте умеют автоапдейт, иначе они отключаются сервером сразу после проверки версии.

N>Например, message sequence numbers внутри потока (и тогда они тоже шифруются). После этого успешно расшифровать поддельный TCP уже не сможешь; а если смог — то ремотная программа взломана и вопрос именно в этом.

поясни плиз, не въезжаю...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 10.01.2018 19:47 niXman . Предыдущая версия .
Re[2]: подделка пакетов
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.01.18 19:56
Оценка:
еще вариант: в клиенте используется dll`ка libsodium. враг же мог изменить в исходниках libsodium фукнцию crypto_secretbox_easy(), в ней патчить пакет, и собрать из этих исходников dll`Ку... линковка клиента со статической версией libsodium, поможет?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 10.01.2018 20:04 niXman . Предыдущая версия .
Re[3]: подделка пакетов
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.01.18 20:11
Оценка: +1
Здравствуйте, niXman, Вы писали:

N>>А вот атака с подделкой sequence numbers — тут вполне возможна.

X>о чем речь?

У Алисы текущий seq в сторону Боба, например, 123000, Боб имеет такой же приёмный.
Маллет посылает пакет с src ip Алисы и таким же seq 123000 размером 30 байт.
Боб принимает пакет, кладёт 30 байт в сокетный буфер, отдаёт Алисе TCP ACK с seq=123030.
Алиса видит seq больше того, что она посылала, кричит "Грабят!" и посылает RST в сторону Боба.

N>>Например, message sequence numbers внутри потока (и тогда они тоже шифруются). После этого успешно расшифровать поддельный TCP уже не сможешь; а если смог — то ремотная программа взломана и вопрос именно в этом.

X>поясни плиз, не въезжаю...

Нумеруешь посылки — 1,2,3... — и номер внутри шифрованной части, чтобы тот, кто не знает ключа, не смог воспроизвести ровно следующий номер.
Тогда, если он воспроизвёл, но прислал чушь — значит, взломано (или просто баг) не на сети посредине, а у клиента.
The God is real, unless declared integer.
Re[4]: подделка пакетов
От: reversecode google
Дата: 10.01.18 20:35
Оценка: +1
Здравствуйте, netch80, Вы писали:

N>Нумеруешь посылки — 1,2,3... — и номер внутри шифрованной части, чтобы тот, кто не знает ключа, не смог воспроизвести ровно следующий номер.

N>Тогда, если он воспроизвёл, но прислал чушь — значит, взломано (или просто баг) не на сети посредине, а у клиента.

все уже придумано до нас
SRTP тоже ключи вроде не разбрасывают но...
алгоритм скрытия номера описан в https://www.cisco.com/c/en/us/about/security-center/securing-voip.html
и реализован в самой libsrtp от циско
Re[4]: подделка пакетов
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.01.18 06:59
Оценка:
Здравствуйте, netch80, Вы писали:

N>Нумеруешь посылки — 1,2,3... — и номер внутри шифрованной части, чтобы тот, кто не знает ключа, не смог воспроизвести ровно следующий номер.

N>Тогда, если он воспроизвёл, но прислал чушь — значит, взломано (или просто баг) не на сети посредине, а у клиента.
не понимаю зачем это нужно... в соседней теме и привел тело пакета. в этом теле есть валидный YAS заголовок, и ровно в том месте, где и должен быть. но в теле пакета мусор.
это же получается ровно то же самое, что и с нумерованием. пакет пропатчили перед щифрованием... или я что-то упускаю?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 11.01.2018 7:32 niXman . Предыдущая версия .
Re[5]: подделка пакетов
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.01.18 07:01
Оценка:
Здравствуйте, reversecode, Вы писали:

R>все уже придумано до нас

R>SRTP тоже ключи вроде не разбрасывают но...
R>алгоритм скрытия номера описан в https://www.cisco.com/c/en/us/about/security-center/securing-voip.html
R>и реализован в самой libsrtp от циско

ох, сколько текста %)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: подделка пакетов
От: reversecode google
Дата: 11.01.18 08:47
Оценка: +1
если совсем сжато, то
на передающей и принимающей стороне используется большой 64 битный индекс
этот 64 индекс используется в векторе для aes криптографии
по каналу данных передается только меньшая 32 часть индекса

алго формирования 64 битного индекса на принимающей стороне есть в ссылке, в rfc, и самой либе
Re: подделка пакетов
От: andyp  
Дата: 11.01.18 21:40
Оценка: +2
Здравствуйте, niXman, Вы писали:

X>глобальный вопрос: как защититься?


Уверен что это атака, а не баг в клиенте? Может, что-то тупо постреляло в память, куда ты до этого сериализовался.
Re[2]: подделка пакетов
От: reversecode google
Дата: 11.01.18 22:10
Оценка:
я вам больше скажу
у меня была ситуация с одним немецким интернет провайдером, который суров ко всяким торрентам итд, видимо всякие IDS фильтров наставлено до черта

так вот, при большой загрузке канала у клиента, данные по tcp в сокете после read приходили неверными, реконнект tcp сессии занимает много времени, а данные бежали релтайм

времени не было разбираться, на то сдвигаются ли они, т.е. какие то выпадание данных или выборочно портятся
немецкий пров косился, мол у нас все нормально это с вашей стороны

ушел с tcp на udp+crc32 с ретрансмитами
Re[3]: подделка пакетов
От: andyp  
Дата: 12.01.18 09:48
Оценка:
Здравствуйте, reversecode, Вы писали:


R>я вам больше скажу...


Всяко бывает, но у niXman с целостностью того, что приходит из сокета всё ок. crypto_secretbox_open_easy() прицепляет некий дайджест к каждому криптованному кусочку и проверяет его после декриптовки.
Re[4]: подделка пакетов
От: reversecode google
Дата: 12.01.18 10:40
Оценка:
да это понятно
я всего лишь поделился опытом
хотя для меня было удивительным, по правилам read должен был вернуть мне какую то ошибку
а не отдавать испорченные данные
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.