суббота, 9 июня 2018 г.

HSTS и SSL cert pinning: насколько хороша защита?

Принято считать, что два данных костыля успешно решают проблему MiTM в HTTPS.

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

Нет. Не решают. Как и любой костыль, состряпанный на скорую руку - порождают новые. Объясню на пальцах, почему так.


HSTS

У HSTS только одна проблема. Это заголовки. Которые можно успешно проигнорировать.

Например, вот так (это кусок реального конфига):

 # Disable HSTS  
 reply_header_access Strict-Transport-Security deny all  
 reply_header_replace Strict-Transport-Security max-age=0; includeSubDomains  
   

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

Но это делается. Например, BlueCoat. И практически полностью перекрывает действие заголовков для клиентов.


Certificate pinning

Задумано было (если абстрагироваться от корявости HTTPS вообще) очень замечательно. Технология позволяет просто не устанавливать соединение, если обнаружена попытка MiTM.

Но.

Этот пистолет можно развернуть в обратную сторону.

Подумайте вот о чем.

Да, мне не удастся вклиниться в соединение и расшифровать его.

Но мне это и не надо. Меня вполне устроит, если я не дам установить соединение такому приложению.

Улавливаете, о чем я?

Обычно для того, чтобы пропустить такое соединение, я должен написать правило, которое, обнаружив по SNI целевой адрес, для которого достоверно известно, что используется pinning, пропустит соединение по splice (то есть сделает туннелинг).

Суть в том, что по-умолчанию этого не происходит автоматически.

То есть, если не задано явного правила для пропуска, такие приложения не будут пропущены. По факту, происходит DoS (Deinal-of-Service).

Я хочу еще раз повторить - для этого даже SSL Bump не надо делать. Достаточно увидеть SNI.

Безусловно, соединение не будет перехвачено. Но оно будет терминировано, что, в ряде случаев, и достаточно. Безопасность соблюдена, да. MiTM не состоялся. Но приложение не работает, что и требуется некоторым сторонам. И банить по IP или hostname не нужно.

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

В какой-то момент цензоры сообразят (а некоторые - уже сообразили), что действовать методом грубой силы не получается. И тогда они сообразят, что и половина цели - достаточна.

UPDATE

Чтобы не быть голословным, дам пару ссылок. Раз (обратите внимание на название компании и загляните в ее блог) и два (читать внимательно, обратить внимание на иллюстрации). Заметьте - это не опенсурс, а вполне себе коммерческие решения, не первый год присутствующие на рынке. Также известно, что они достаточно широко применяются не только в энтерпрайзе, а вполне себе в крупных ISP. Такие дела.