
Адаптер блоков с интроспекцией протокола для отказоустойчивых данных
Protocol-Introspecting Chunk Adapter for Resilient Data
Для самоучек, для нестандартных и для всех, кому когда-либо говорили не лезть не в своё дело. Продолжайте создавать, продолжайте исследовать.
PICARD шифрует ваши данные, нарезает их на чанки и разбрасывает эти чанки по любым настроенным вами протокольным эндпоинтам: записям DNS TXT, API социальных сетей, брокерам MQTT, бакетам S3, Bluetooth-объявлениям или всему перечисленному сразу. Заберите их обратно — и он соберёт всё воедино. При многоадаптерном разбрасывании ни один отдельный эндпоинт не хранит достаточно шифротекста, чтобы что-либо восстановить. Никакого центрального сервера. Никакой ежемесячной платы за хранение. Монтируется как обычная файловая система.
Не эффективно. Зато протокол-агностично.
[!IMPORTANT] Исследовательский проект. PICARD — это работающий эксперимент по информатике, а не промышленная система хранения. Прочитайте уведомление об исследовании и правовые аспекты, прежде чем продолжать.
[!WARNING] Экспериментально: используйте на свой страх и риск. Эти адаптеры используют аппаратные уязвимости в качестве примитивов хранения. Результаты зависят от конкретного оборудования, недетерминированы на разных машинах и необратимы в случае переворота битов DRAM. Используйте только на оборудовании, которым вы владеете и которое контролируете. Работа против общей или облачной инфраструктуры в большинстве юрисдикций является несанкционированным доступом.
Теперь PICARD может хранить чанки в состояниях битов DRAM и резидентности в кэше CPU — полностью вне поля зрения операционной системы.
| Адаптер | Что он делает |
|---|---|
rowhammer | Записывает биты, «обстреливая» соседние строки DRAM, пока утечка заряда не перевернёт целевые биты. Читает, напрямую исследуя строку-жертву. Локально, эфемерно, не-ECC DDR3/4. |
halfdouble | Двухшаговый вариант. Соотношение ближних/дальних агрессоров обходит DDR4 Target Row Refresh (TRR). Достигает оборудования, на которое классический rowhammer больше не действует. |
throwhammer | «Обстреливает» DRAM удалённого хоста через RDMA. Удалённый CPU вообще не задействован — NIC выполняет DMA-чтение напрямую в DRAM. Требует RDMA-фабрику. |
cpu-cache | Хранит биты в SRAM кэша L3 CPU через Flush+Reload. Кодирование мажоритарным голосованием N_REPS=5 по изолированным по страницам слотам. BER ниже 5e-4 на i7-12700KF. Межпроцессно на одном хосте; между VM там, где активна дедупликация страниц. |
Все четыре эфемерны (перезагрузка стирает данные). См. docs/adapters.md для требований к оборудованию и модели угроз.
plaintext
→ AES-256-GCM encrypt (Argon2id key, per-block salt + nonce)
→ PCHK chunk (protocol-sized pieces)
→ scatter across adapters (DNS, Redis, Reddit, S3, MQTT, …)
→ sealed envelope (HKDF sub-key, correlation tag per adapter)
retrieve
← fan out to all adapters
← collect, verify, assemble
← decrypt
Каждый блок независимо шифруется со своей собственной случайной солью и nonce. Чанки распределяются по круговому принципу или через RAID-профили. Ни один адаптер не видит открытый текст; ни один адаптер не видит достаточно шифротекста, чтобы что-либо восстановить.
Локальный индекс (база данных SQLite, зашифрованная AES-256-GCM) сопоставляет пути с местоположениями чанков. Потеряете парольную фразу — потеряете данные.
Это было прохладное берлинское утро. Со своей террасы я смотрел на простую оштукатуренную стену, увенчанную красным кирпичом. Мелькнувшие крылья привлекли моё внимание: маленькая птица свернула к дренажному отверстию у линии крыши и исчезла. Из другого отверстия показалась ещё одна голова, щебеча. Пять дренажных отверстий, пять гнёзд. Желоба были предназначены для отвода воды, а не для размещения семей, но птицы нашли укрытие, защиту и лёгкий доступ. Я никогда этого не замечал, потому что никогда не удосуживался посмотреть.
Наша цифровая инфраструктура несёт больше, чем была рассчитана хранить. Записи DNS TXT принимают произвольный текст в пределах спецификации. Retained-сообщения MQTT сохраняют данные на брокере. Пакеты ICMP echo несут поле полезной нагрузки. API социальных сетей принимают свободно структурированный текст. Каждый из этих протоколов определяет поля, предназначенные для метаданных, обнаружения или диагностики. Эти поля могут нести байты точно так же, как и предполагаемые их создателями сценарии использования.
picard web открывает панель в браузере по адресу http://localhost:8471.
Поверхность хранения по категориям, состояние адаптеров и сведения о шифровании с первого взгляда.
259 адаптеров с возможностью просмотра по категориям, с обязательными параметрами и добавлением в один клик.
pip install picard-store
export PICARD_PASSPHRASE="your-passphrase" # or picard will prompt
picard init # create picard.toml
# edit picard.toml to add your adapters, then:
picard put myfile.txt --as /docs/myfile.txt
picard get /docs/myfile.txt -o recovered.txt
picard ls
picard tree /
Из источника:
git clone https://github.com/neitzert/picard
cd picard
pip install -e ".[dev]"
python -m pytest --tb=short -q
# picard.toml
[general]
block_size = 65536
[[adapters]]
name = "dns-primary"
type = "dns"
enabled = true
params = { nameserver = "10.10.10.10", domain = "chunks.example.com" }
[[adapters]]
name = "s3-backup"
type = "s3"
enabled = true
tor_proxy = true # route through Tor SOCKS5
params = { bucket = "picard-chunks", prefix = "data/" }
[[adapters]]
name = "reddit-stash"
type = "reddit"
enabled = true
browser_mode = "headed" # api | headless | headed
params = { subreddit = "u_myuser" }
[[raid]]
level = "raid5"
adapters = ["dns-primary", "s3-backup", "filesystem"]
[scatter.paranoid]
raid_level = "raid10"
min_adapters = 4
Профили распределения: quiet, resilient, speed, paranoid
| Команда | Описание |
|---|---|
picard put <file> --as <path> | Сохранить файл |
picard get <path> -o <file> | Извлечь файл |
picard ls [path] | Список файлов |
picard rm <path> | Удалить |
picard cp / mv | Копировать / переименовать |
picard tree / | Дерево каталогов |
picard verify <path> | Проверка целостности чанков |