аутентификация узлов и раунд укрепления
клиент теперь проверяет ключи узлов по якорю уц, а узлы отвергают повторные служебные ячейки установки, держат counter ячеек строго подряд и ограничивают то, что может занять один адрес.
с прошлой заметки в основную ветку вошли четыре изменения. они сужают то, что принимают клиент и узел. числа на странице исследования те же, это прежняя предварительная серия.
ключи узлов проверяются по якорю
клиент берёт ключи узлов только из подписанного комплекта: это сертификат от удостоверяющего центра и дескриптор, подписанный собственным ключом подписи узла. каждый узел цепочки клиент проверяет по якорю доверия, то есть по открытому ключу уц, и при любой ошибке отказывается строить цепочку. запасного пути к непроверенным ключам нет.
сертификаты выдаёт jimichi enroll вне кластера. ключ уц создаётся на одну выдачу и сразу
освобождается. узел создаёт ключ подписи в памяти при старте, ключ не покидает процесс, а
сертификат устанавливается один раз на процесс узла.
зачем это нужно: это мера против подмены ключей узлов при их получении клиентом.
служебная ячейка установки открывается один раз
узел помнит метку каждой открытой им служебной ячейки установки цепочки, пока жив его ключ, и отбрасывает копию, в том числе после закрытия исходной цепочки. число меток ограничено, и заполненный узел отказывает в новых цепочках, а не забывает метку.
зачем это нужно: иначе копия заново создала бы ключ хопа, и счётчики пошли бы с нуля под тем же ключом.
counter строго подряд и свой на каждом канале
counter ячейки принимает своё значение на каждом канале цепочки. узел принимает ячейку, только если её counter на единицу больше последнего принятого: копия, пропуск или перестановка закрывают цепочку, и дальше ячейка не идёт.
зачем это нужно: свой counter на каждом канале входит в меру против связывания потока по заголовкам ячеек, а пересылка повтора дала бы активному наблюдателю бесплатную временную метку.
ограничения узла
у рукопожатий, установок и записи есть сроки, а цепочка разрывается после времени простоя и по истечении срока жизни. соединение принимается или отклоняется в момент приёма, до любого согласования ключей, и один адрес получает не больше своей доли каналов, рукопожатий и установок. на стенде сетевая политика пускает к каждому порту ячеек только предыдущее звено.
зачем это нужно: молчащий сосед держит место только до истечения срока, и один адрес не может занять все места.
чего это не исправляет
- слои цепочки по-прежнему не обладают прямой секретностью против соседа.
- узел не отличает другой узел от клиента, пока каналы между узлами не аутентифицированы.
- каталога узлов нет, отзыва нет, кроме истечения сертификата и перезапуска узла.
- отказ в обслуживании сверх ограничений узла не предотвращается и не измеряется.
полный список на странице границ и в границах применимости. форматы и порядок проверок описаны в архитектуре, угрозы и меры в модели угроз. опубликованные сообщения об уязвимостях лежат на странице security advisories репозитория.