С момента самого появления Telegram его не критиковал только ленивый. Этим с одинаковым энтузиазмом занимались резиденты Reddit, Hacker News, etc.
В порыве урезонить самых яростных критиков был объявлен конкурс с главным призом в 200 000$ для первого из тех, кому удастся взломать протокол, и прочесть содержимое секретного чата между двумя вымышленными пользователями.
Конкурс, как судя по всему и рассчитывали устроители, привлек к себе внимание, однако вызвал шквал еще большей критики в силу ограниченности потенциальных исследователей в выборе инструментов для анализа: доступно было лишь зашифрованное содержимое переписки, без возможности влиять на ее содержимое или вступать в какое-либо взаимодействие с ее авторами (исключая таким образом возможности для MITM, replay-атак, etc).
В ответ некоторые даже предлагали встречный челлендж на аналогичных условиях, с заведомо уязвимым протоколом, указывая на нереалистичность предложенного сценария.
Спустя год, учтя критику, Telegram объявил о новом контесте с призовым фондом в 300 000$ за взлом протокола и дополнительным в 100 000$ за успешно проведенную атаку, итогом которой станет прием ботом зашифрованного сообщения от атакующего.
На этот раз любой исследователь может выступать не только в пассивной роли наблюдателя, но и имеет возможность для проведения активных атак (MITM, CPA, tampering, etc.).
Широкий простор возможностей для исследователей скрывает, однако, неумолимый факт: угрозой для протоколов чаще становятся банальные ошибки реализации, нежели уязвимая схема. Допускают ошибки все, и программисты здесь, к сожалению, не исключение:
Apple’s 'goto fail' (CVE-2014-1266)
OpenSSL’s 'Heartbleed' (CVE-2014-0160).
Bash's 'ShellShock' (CVE-2014-6271)
Это лишь небольшой список тех, что обрели существенный резонанс в силу критичности и охвата.
Памятуя о том, что программисты ошибаются чаще чем, математики*, я решил начать исследование не с протокола, а с клиентов, реализующих этот самый протокол. Начать было решено с консольного клиента.
![](https://habrastorage.org/r/w1560/files/1dc/ac8/1d8/1dcac81d835e49a4b761be38bb12f11e.png)
Каково же было удивление, когда обнаружилось, что все данные «секретного» чата (включая _приватный_ ключ) хранятся на диске в незашифрованном виде:
![](https://habrastorage.org/r/w1560/files/404/e28/c3a/404e28c3ae964e7bbefe02c7fa9e4535.png)
![](https://habrastorage.org/r/w1560/files/fb3/a82/3be/fb3a823beac64ef5bf98602a87f3a57e.png)
И считываются двумя функциями `read_secret_chat_file`
![](https://habrastorage.org/r/w1560/files/a33/861/063/a3386106374e4c19ba098c4adbbd8fcb.png)
И `read_secret_chat`:
![](https://habrastorage.org/r/w1560/files/f5d/756/a89/f5d756a8980e4d978a0e9849665ca73f.png)
Что легко подтверждается отладчиком:
![](https://habrastorage.org/r/w1560/files/3b6/6a9/a69/3b66a9a694e34397924eddd8d39f3117.png)
Что это означает для конечного пользователя?
Поскольку протокол Telegram не гарантирует forward secrecy (PFS), это означает, что злоумышленник, долгое время находившийся в режиме пассивного прослушивания (eavesdropping), получив контроль над вашим устройством, помимо содержимого всех секретных чатов (открытых на данном устройстве), получит также возможность продолжить от вашего имени любой из них, не являющийся к тому моменту принудительно завершенным.
Насколько надежным выглядит протокол с такой перспективы?
Не слишком. Поскольку в таком случае надежность всей вашей переписки начинает определяться не устойчивостью протокола, а надежностью самой слабой компоненты вашей системы, будь то браузер… или шелл.
Stay tuned.
P.S. Проблема оказалась эндемичной не только для консольного клиента но и для Android-клиента (https://github.com/DrKLO/Telegram)
![](https://habrastorage.org/r/w1560/files/abf/d45/33e/abfd4533ef234ee691d69ad5f1b5899d.png)
P.P.S. Разработчики Telegram в курсе проблемы и считают ее приемлимым компромиссом:
Умалчивая однако, тот факт, что атакующий будет иметь возможность не только расшифровать все** сообщения post factum, но и перехватить и продолжить сессию таким образом, что собеседник скомпрометированного пользователя не заметит подмены.
P.P.P.S. Недавно введенный в протокол механизм ratcheting'а (re-keying protocol), проблему не решает, а при некоторых обстоятельствах только усугубляет: благодаря тому, что ratchet (re-keying protocol), призванный гарантировать perfect forward secrecy, не гарантирует PFS в строгом смысле (окно для ratchet'а — 100 сообщений или 1 неделя), атакующий может перехватить сессию и принудительно инициировать новый ratchet, «отрезая» таким образом скомпрометированного пользователя от сессии.
* Что, конечно же, неправда.
** До 20-й версии (20 layer) протокола абсолютно все, начиная с 20-й версии протокола, все, начиная с последнего ratchet'а.
В порыве урезонить самых яростных критиков был объявлен конкурс с главным призом в 200 000$ для первого из тех, кому удастся взломать протокол, и прочесть содержимое секретного чата между двумя вымышленными пользователями.
Конкурс, как судя по всему и рассчитывали устроители, привлек к себе внимание, однако вызвал шквал еще большей критики в силу ограниченности потенциальных исследователей в выборе инструментов для анализа: доступно было лишь зашифрованное содержимое переписки, без возможности влиять на ее содержимое или вступать в какое-либо взаимодействие с ее авторами (исключая таким образом возможности для MITM, replay-атак, etc).
В ответ некоторые даже предлагали встречный челлендж на аналогичных условиях, с заведомо уязвимым протоколом, указывая на нереалистичность предложенного сценария.
Спустя год, учтя критику, Telegram объявил о новом контесте с призовым фондом в 300 000$ за взлом протокола и дополнительным в 100 000$ за успешно проведенную атаку, итогом которой станет прием ботом зашифрованного сообщения от атакующего.
На этот раз любой исследователь может выступать не только в пассивной роли наблюдателя, но и имеет возможность для проведения активных атак (MITM, CPA, tampering, etc.).
Широкий простор возможностей для исследователей скрывает, однако, неумолимый факт: угрозой для протоколов чаще становятся банальные ошибки реализации, нежели уязвимая схема. Допускают ошибки все, и программисты здесь, к сожалению, не исключение:
Apple’s 'goto fail' (CVE-2014-1266)
OpenSSL’s 'Heartbleed' (CVE-2014-0160).
Bash's 'ShellShock' (CVE-2014-6271)
Это лишь небольшой список тех, что обрели существенный резонанс в силу критичности и охвата.
Памятуя о том, что программисты ошибаются чаще чем, математики*, я решил начать исследование не с протокола, а с клиентов, реализующих этот самый протокол. Начать было решено с консольного клиента.
![](https://habrastorage.org/files/1dc/ac8/1d8/1dcac81d835e49a4b761be38bb12f11e.png)
Каково же было удивление, когда обнаружилось, что все данные «секретного» чата (включая _приватный_ ключ) хранятся на диске в незашифрованном виде:
![](https://habrastorage.org/files/404/e28/c3a/404e28c3ae964e7bbefe02c7fa9e4535.png)
![](https://habrastorage.org/files/fb3/a82/3be/fb3a823beac64ef5bf98602a87f3a57e.png)
И считываются двумя функциями `read_secret_chat_file`
![](https://habrastorage.org/files/a33/861/063/a3386106374e4c19ba098c4adbbd8fcb.png)
И `read_secret_chat`:
![](https://habrastorage.org/files/f5d/756/a89/f5d756a8980e4d978a0e9849665ca73f.png)
Что легко подтверждается отладчиком:
![](https://habrastorage.org/files/3b6/6a9/a69/3b66a9a694e34397924eddd8d39f3117.png)
Что это означает для конечного пользователя?
Поскольку протокол Telegram не гарантирует forward secrecy (PFS), это означает, что злоумышленник, долгое время находившийся в режиме пассивного прослушивания (eavesdropping), получив контроль над вашим устройством, помимо содержимого всех секретных чатов (открытых на данном устройстве), получит также возможность продолжить от вашего имени любой из них, не являющийся к тому моменту принудительно завершенным.
Насколько надежным выглядит протокол с такой перспективы?
Не слишком. Поскольку в таком случае надежность всей вашей переписки начинает определяться не устойчивостью протокола, а надежностью самой слабой компоненты вашей системы, будь то браузер… или шелл.
Stay tuned.
P.S. Проблема оказалась эндемичной не только для консольного клиента но и для Android-клиента (https://github.com/DrKLO/Telegram)
![](https://habrastorage.org/files/abf/d45/33e/abfd4533ef234ee691d69ad5f1b5899d.png)
P.P.S. Разработчики Telegram в курсе проблемы и считают ее приемлимым компромиссом:
The protocol’s principal drawback is that an intruder passively intercepting messages and then somehow appropriating the authorization key (for example, by stealing a device) will be able to decrypt all the intercepted messages post factum. This probably is not too much of a problem (by stealing a device, one could also gain access to all the information cached on the device without decrypting anything); however, the following steps could be taken to overcome this weakness
Умалчивая однако, тот факт, что атакующий будет иметь возможность не только расшифровать все** сообщения post factum, но и перехватить и продолжить сессию таким образом, что собеседник скомпрометированного пользователя не заметит подмены.
P.P.P.S. Недавно введенный в протокол механизм ratcheting'а (re-keying protocol), проблему не решает, а при некоторых обстоятельствах только усугубляет: благодаря тому, что ratchet (re-keying protocol), призванный гарантировать perfect forward secrecy, не гарантирует PFS в строгом смысле (окно для ratchet'а — 100 сообщений или 1 неделя), атакующий может перехватить сессию и принудительно инициировать новый ratchet, «отрезая» таким образом скомпрометированного пользователя от сессии.
* Что, конечно же, неправда.
** До 20-й версии (20 layer) протокола абсолютно все, начиная с 20-й версии протокола, все, начиная с последнего ratchet'а.