100500 способов передать данные в программу

Задача: надо считать ssl-сертификат и приватный ключ.
Они, естественно, зашифрованы.
Сертификат находится в известном файле, но надо безопасно считать пароль.

Сертификат считается считанным безопасно, если имея права рута единственная возможность узнать пароль — сделать дамп памяти сервера.

Попробуем поочередно воспользоваться известными способами

  1. Самый простой способ — через консоль (stdin). Сервер — это демон. Так что потока stdin у нас нет.
  2. Через файл. Имея права рута можно получать сообщения при создании файлов и копировать их. Небезопасно.
  3. Через графический интерфейс. GUI у моего демона нет.
  4. Через сетевой сокет. Пакеты перехватываются. SSL тоже не спасет, т.к. мне не известен приватный ключ сервера — я же его и пытаюсь прочитать.
  5. Через DBus. Сообщения перехватываются.
  6. Через linux-сокеты. Слишком муторно. К тому же есть нехорошее чувство, что можно устроить man-in-the-middle.
  7. Через параметры командной строки. С какими параметры запущенны все процессы известно.
  8. Через исходный код программы. Но исходники тоже доступны

Я остановился на методе 2. Больше недели я был уверен, что это единственный более-менее адекватный метод. При этом была маловероятна компрометация пароля, т.к. файл жил всего секунду, или до того момента, как запускался мой демон.

Но сегодня все изменилось. Мной был найден еще один способ передачи данных в программу. Теперь, по-настоящему безопасный.

И это fork().
fork(), который создает полную копию программы отличающуюся одним int’ом от себя. Получается, что мы можем передать критический пароль из программы в саму в себя. Остальное — дело техники.

Итоговое решение — программа использует ncurses для безопасного чтения пароля. fork(). Главная часть завершается, а потомок превратившийся в демона имеет у себя в недрах заветный пароль.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *