В статье поедполагается описать опыт автора по изобретению велосипеда в
лице консольной напоминалки паролей. Велосипед изобретался по причине
неудовлетворённости найденными разработками в данном направлении.
Да и вообще немного и на пальцах, о том, как можно использовать PGP в
домашних условиях для шифрования важных данных.URL: http://dev.sputnikmedia.net/~rulez/files/pgp.article.txt
Новость: http://www.opennet.me/opennews/art.shtml?num=2793
Внимание!!! Этот ╚чудо скрипт╩ больше похож на Троянского коня.
Да ладно... :) Параноя это конечто неплохо, но надо ж чуствовать меру :)
Я думаю почти каждый(и я тоже) использует подобные "велосипеды" но вот человека не обламало описать процесс изготовления.
А трояна там никакого нету - там же 10 строк и из нестандартных команд - только gnupg - чем там троянить? :)
Раз. Почему Троян?! Эта ╚полезная программа╩ содержит несколько ошибок (надеюсь, что неумышленных), используя которые злоумышленник может произвести несколько различных атак, в результате которых получит ╚защищенные╩ пароли. OpenNET довольно популярный ресурс среди администраторов, причем последние зачастую несильно высокой квалификации, и без разбора применяют приводимые решения. На скольких серверах окажется эта чудо программа, скажем, через неделю? На одном, на десяти, на сотнях┘Два. Программа, очевидно, предназначена для использования на системах доступ (причем, необязательно легальный) к которым могут иметь как минимум несколько пользователей.
Три. Вот несколько атак навскидку:
1) ОШИБКА:
Пароли длительное время доступны в открытом виде:
cat ${FILE} | gpg -d -q > /tmp/$$
УСЛОВИЯ:
Злоумышленник является пользователем root! А почему бы и нет?!
АТАКА:
Злоумышленнику нужно написать и запустить простенькую программку, которая следит за вновь созданными файлами в директории /tmp, имена которых состоят из одних цифр ($$), и сохраняет их содержимое в надежном месте.
2) ОШИБКА:
Пароли некоторое время доступны на чтение всем пользователям:
cat ${FILE} | gpg -d -q > /tmp/$$
chmod 600 /tmp/$$
${EDITOR} /tmp/$$
УСЛОВИЯ:
Нужно угадать (предсказать) диапазон возможных значений PID▓а ╚чудо программы╩. umask пользователя использующего ╚чудо программу╩ должен быть на подобии 022.
АТАКА:
Злоумышленник создает файлы в директории /tmp имена, которых определяются диапазоном возможных значения PID▓а ╚чудо программы╩. Например, файлы /tmp/{23,24,25,26,27} для диапазона [23,27]. Причем файлы должны быть доступны на запись пользователю запустившему ╚чудо программу╩. Далее атакующий ╚следит╩ за этими файлами, - ждет, когда в каком-нибудь из них появятся пароли, то есть, выполнится команда cat ${FILE} | gpg -d -q > /tmp/$$. Очевидно, что выполнение второй команды (chmod 600 /tmp/$$) завершится ошибкой, но ее результат не проверяется и в любом случае будет запущен текстовый редактор.
Внимание, вопрос. Заметит ли пользователь сообщение об ошибке? Пусть даже заметит. Если в файле паролей хранится пароль root▓а для какого-нибудь удаленного сервера, то программа злоумышленника может войти на этот сервер и просто сменить пароль root▓а. Очень вероятно, что данная процедура закончится до того как пользователь успеет разобраться, что вообще происходит.
3) ОШИБКА:
cat /dev/null > /tmp/$$
rm -rf /tmp/$$
УСЛОВИЯ:
Пока вы были в отпуске, винчестер, где хранились ╚защищенные пароли╩ посыпался bad block▓ами и его пришлось выкинуть.
АТАКА:
Атакующий подбирает выкинутый винчестер, и использую ╚недавние достижения NIST в туннельной электронной микроскопии╩ (Bruce Schneier, ⌠Applied Cryptography■, 2002) восстанавливает /tmp/$$.Итого. Ошибки, допущенные в ╚чудо программе╩, - элементарны, поэтому и возникает ощущение, что это Троянский конь. Конечно, автор мог допустить их случайно, но тогда он совершенно некомпетентен в области, которую пытался осветить.
Всё так. Не спорю - варианты взлома хоть и достаточно абсурдны, но реальны.
Немного изменил скрипт:
#!/bin/sh
# Copyright (c) Alexander Kulinich <rulez@rulez.kiev.ua>
# senx John Doe <jdatzmail.ru> for security check :)FILE=~/.ssh/passwords
EMAIL="rulez@rulez.kiev.ua"
FIELDS='a:|r:|f:'
FIELDS_NUM=3
TMP_FILE=/tmp/`echo date | md5`umask 22
if [ $# -eq 2 ]
then
cat ${FILE} | gpg -d -q 2>/dev/null | \
grep -A ${FIELDS_NUM} -E "$1 |$1$" | \
grep " $2:"
else
if [ $# -eq 1 ]
then
if [ $1 = '-e' ]
then
cat ${FILE} | gpg -d -q > ${TMP_FILE} && \
chmod 600 ${TMP_FILE} && \
${EDITOR} ${TMP_FILE}
cat ${TMP_FILE} | gpg --encrypt --recipient ${EMAIL} > ${FILE}
cat /dev/urandom | tr -cd A-HJ-NP-Za-km-z1-9 | head -c1000 > ${TMP_FILE}
rm -rf ${TMP_FILE}
else
cat ${FILE} | gpg -d -q 2>/dev/null | \
grep -A ${FIELDS_NUM} $1 | grep -E ${FIELDS}
fi
else
echo USAGE: `basename $0` host [user]
fi
fiИ, я не думаю, что на shell врядли получится написать что-то кардинально совершеннее в плане безопасности.
Основная проблемма - надо как-то передавать данные между редактором и gpg.
Пайп не выход - в редактор передать данные с его помощью можно, а забрать - врядли. Разве что редактор умеет выдавать на стандартный вывод отредактированный файл, нигде его не сохраняя. Я таких редакторов не знаю.В любом случае - я не ставил себе задачей написать универсальную и абсолютно безопастную утилиту, как не ставил задания писать Троянского коня. В моей ситуации данного решения более чем достаточно.
Ну и ещё в свою защиту могу сказать, что редактирование было добавлено лишь для того, чтобы руками не выполнять все те команды, что делаются автоматически - перенаправление вывода в файл, редактирование этого файла, шифрование и удаление его.
PS. Может вы мне подскажете, что за область я хотел осветить? :)
Тьху, блин, пора спать :)
Естественно - не
TMP_FILE=/tmp/'echo date | md5'
а
TMP_FILE=/tmp/'date | md5'
или даже так:
TMP_FILE=/tmp/'echo `date`$$ | md5'
RND_NUM=`cat /dev/urandom | tr -cd 5-9 | head -c1` TMP_FILE=/tmp/`echo $$ | md5 | tail -c${RND_NUM}``date | md5 | head -c${RND_NUM}`
Забавно. Все приводимые заплатки выглядят внушительно (складывается ощущение, что проблемы решены), а на самом деле бесполезны.1) Теперь открытые пароли хранятся не в /tmp/<число>, а в /tmp/<очень случайная строка символов>, но суть от этого не меняется √ некоторое время файл содержащий открытые пароли доступен не чтение всем пользователям! Нет ничего сложного в том, чтобы следить за всеми вновь создаваемыми файлами во временной директории. Соответственно злоумышленнику нужно успеть прочитать файл с паролями после выполнения команды cat ${FILE} | gpg -d -q > ${TMP_FILE} и до выполнения chmod 600 ${TMP_FILE}. А это не так маловероятно, как может показаться на первый взгляд. Каждая из этих команд √ процесс, а первая и не один (правда, это неважно). Процесс создается относительно медленно. К тому же, атакующая программа может повысить свои шансы fork▓нувшись раз этак 10, а то и побольше.
ИТОГО. Файл с открытыми паролями должен располагаться в недоступном для остальных пользователей месте, а не в директории /tmp. Вопрос со ╚злым╩ root▓ом остается открытым.2) Команда cat /dev/urandom | tr -cd A-HJ-NP-Za-km-z1-9 | head -c1000 > ${TMP_FILE}, по сути, ничем не отличается от cat /dev/null > /tmp/$$.
ИТОГО. Для чего создана утилита shred?
1. Предложи лучшее решение на sh
2. По сути.
Как уде сказали - ложить можно в хоум - если на машине есть рут ещё у кого-то - не выход.
Если редактор - vim, то можно сделать такую фишку:touch ${TMP_FILE} && \
chmod 600 ${TMP_FILE} && \
vim -c 'read !gpg -d -q' ${TMP_FILE} && \
cat ${TMP_FILE} | gpg --encrypt --recipient ${EMAIL} > ${FILE}
сat /dev/urandom | tr -cd A-HJ-NP-Za-km-z1-9 | head -c1000 > ${TMP_FILE}
rm -rf ${TMP_FILE}Но и тут если рут есть ещё у кого-то на долю сунды(в момент сохранения) в ${TMP_FILE} опять же оказываются пароли в чистом виде.
Утилиты shred я во FreeBSD не нашел, потому не игрался.А к вопросу со "злым рутом" - "злой рут" может и скрипт подправить так, чтобы без извратов оно ему куда надо все пароли сложило.
Выход один - не иметь на машине других пользователей с рутовымы правами.
> vim -c 'read !gpg -d -q' ${TMP_FILE} && \Small bug fix:
vim -c 'read !cat ${FILE} | gpg -d -q' ${TMP_FILE} && \
>В любом случае - я не ставил себе задачей написать универсальную и
>абсолютно безопастную утилиту, как не ставил задания писать Троянского"безопасность". Нет там никакой "Т" inside. :)
/poige
--
http://www.i.morning.ru/~poige/
:))))))))))))AHTUNG!!! Данный скрипт не рекомендуется использовать на машинах, на
которых рут есть у кого-либо кроме вас - это вполне серьёзно.
Кроме того дисковую систему, на которой использовался данный скрипт,
нельзя выбрасывать. Её надо утопить в горячей домне, при этом убедившись
в _полном_ уничтожении. Иначе, злоумышленник, используя "недавние
достижения NIST в туннельной электронной микроскопии (Bruce Schneier,
Applied Cryptography, 2002)" сможет восстановить ваши пароли.
to:John DoeСогласен, "чудо скрипт" - троян.
Принцип действия - социальный инжиринг.
Господа, насчет абстрактного злоумышленника... а кто мешает $HOME/tmp вместо /tmp использовать?
кажется никто
>а кто мешает $HOME/tmp вместо /tmp использовать?
А то, что:
1. такой директории может не быть(но можно создать, а если $HOME - корень например ???)
2. Идеология не верна в принципе - если на ФС записан файл с НЕШИФРОВННЫМИ паролями, то rm -rf file удаляет метку, но не ДАННЫЕ. Уверенным можно быть, ТОЛЬКО после прохода dd по всему диску. А если $HOME монтируется по NFS к примеру ?И вообще:
crypt > passwods.file
Вводим текстcrypt < passwords.file
получаем текст
Чего-то мне кажется, что чегo-то типа John the Ripper прочитает ваш password.file аж на ура :-\
В то время как ПГП с двухкилобайтным ключем ФСБ будет ламать пару недель.
shred /dev/hda
>Чего-то мне кажется, что чегo-то типа John the Ripper прочитает ваш password.file аж на ураПолностью согласен - стойкость никакая. Так что пароли надо хранить в памяти человека :)
И память перидически освежать - зажав ему (юзеру)пальцы в тиски, или иголки под ногти.....я просто про то что это всё класс , но мы прийдём всё к тому же - самое слабое место человек.
Новый адрес: http://rulez.kiev.ua/files/articles/pgp.html