Резервные каналы — старая задача с преимущественно плохими ответами. DGA — это гонка, которую защитник обычно выигрывает: зарегистрируй завтрашние домены сегодня — и канал твой. Fast flux — гонка вооружений, измеряемая счетами за хостинг. Зашитая запасная инфраструктура — подарок тому, кто реверсит образец. Каждый подход хранит секрет восстановления там, куда противник может дотянуться, арестовать или отравить. Мы хотели канал с тремя свойствами: его нельзя устранить, писать в него можем только мы, а чтение выглядит обыденно.
Запись живёт в блокчейне
Ghost Chain хранит адреса замены в небольшом смарт-контракте в Polygon. У контракта ровно один метод записи — вызываемый только кошельком владельца и принимающий только строго возрастающие номера версий, — и один метод чтения, доступный любому, навсегда, бесплатно. Нет админского ключа, который можно украсть, нет хостинг-аккаунта, который можно заблокировать, и нет процедуры тейкдауна, которая до него дотянется. Оператор публикует со своего кошелька; тимсервер никогда не держит ключи кошелька — развёртывание ведётся из панели с прекомпилированными артефактами контракта, а шаг публикации отдаёт оператору готовую транзакцию на подпись.
Сама запись — не список URL в открытую. В блокчейн уходит запечатанный конверт: подпись Ed25519 над всем пакетом, монотонная эпоха и список адресов, зашифрованный ChaCha20-Poly1305 ключом, производным от идентичности сервера. Байты может прочитать любой — в этом смысл публичной цепи, — но проверить и вскрыть их способен только агент AXIS, а поддельная или повторная запись проверку не пройдёт.
sig[64] ‖ nonce[24] ‖ шифротекст ‖ tag[16] # проверка: Ed25519 над "chain-id ‖ server ‖ epoch ‖ body" # вскрытие: ChaCha20-Poly1305, ключ из идентичности сервера # принять: только при валидной подписи И epoch > последней
Что делает агент — и чего не делает никогда
Агент касается блокчейна, только когда исчерпал всё остальное. Триггер — терпение, а не паника: больше двадцати четырёх часов без связи ни с одним из заданных серверов. Затем он делает один HTTPS-вызов к публичной RPC-точке — к тому же типу точек, с которыми говорит каждый криптокошелёк на планете, — запрашивая у контракта его запись. Одно чтение. Агент проверяет подпись, убеждается, что эпоха новее всего виденного, вскрывает конверт и пробует адреса внутри. У него нет кошелька, он не синхронизирует цепь, не тратит газ и никогда не пишет. Для сетевого наблюдателя весь эпизод — один обычный API-вызов к известному публичному сервису.
Доставка наследует ту же страховку: стейджеры Windows, Linux и macOS компилируют резолвер внутрь, так что стейджер, чей bootstrap-эндпоинт умер между сборкой и запуском, может восстановить свежий адрес и повторить попытку — один раз, затем тихо выйти. Минимальное семейство стейджеров остаётся без блокчейна осознанно: не каждый артефакт должен нести каждую возможность.
На агента, с квитанцией
Конфигурация восстановления — не флотская рассылка. Билдер спрашивает на каждую сборку, запечь запись в артефакт или протолкнуть позже; «протолкнуть» значит, что сервер добавляет конфигурацию к чекинам выбранных агентов, пока каждый не подтвердит. Консоль показывает состояние каждого агента — нет, запечено или протолкнуто-и-подтверждено, — так что вопроса, у каких хостов есть путь домой, а у каких нет, не возникает. Потеря ключей цепи была бы потерей канала, поэтому сервер пишет самодостаточную резервную копию с ограниченным доступом на каждом критическом шаге и хранит последние двадцать; восстановление — загрузка в панели, а не церемония.
Во что это обходится — честно
У столь живучего резерва есть реальные компромиссы, и мы предпочитаем назвать их, чем дать вам найти их самим. Запись публична: шифротекст, но видимый — решительный аналитик может сказать, что запись существует и когда меняется, но не что в ней. Восстановление зависит от доступности публичной RPC-инфраструктуры из целевой сети — что обычно, но не всегда верно. Триггер в сутки делает канал каналом терпения, а не живых операций. Публикация стоит комиссию с вашего кошелька — значит, гигиена кошелька становится частью вашего OPSEC. И контракт надёжен ровно настолько, насколько надёжна цепь под ним — мы выбрали сеть, где реорганизации и цензура являются чужой постоянной работой, а не вашей.
Угол защитника
Один тихий вызов публичного RPC — это всё восстановление.
Блокчейн-резолверы уносят канал восстановления туда, куда тейкдауны не достают, — но не делают его невидимым. Процесс, которому нечего делать в криптоинфраструктуре, читающий контракт через известную RPC-точку после долгого молчания, — поведение, достойное правила детекции; вызов редок, мал и предшествует интересному. Более точный сигнал — смотреть, что хост делает после чтения: новые адресата, которых нет ни в одном конфиге на диске. Как и с выдачей модуля, громкий момент узок, но реален, и честный способ описать хорошую функцию обхода — указать на её шов. Мы предпочитаем, чтобы вы мерили шов, а не читали маркетинг.
Следующая заметка: Матрица: как ревизия заслуживает выпуск — отслеживаемая AV/EDR-матрица, три дорожки на семейство движков и почему мы храним свои тупики.