URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 2389
[ Назад ]

Исходное сообщение
"OpenNews: Как сделать небольшую консольную напоминалку паролей на основе PGP."

Отправлено opennews , 19-Авг-03 19:09 
В статье поедполагается описать опыт автора по изобретению велосипеда в
лице консольной напоминалки паролей. Велосипед изобретался по причине
неудовлетворённости найденными разработками в данном направлении.
Да и вообще немного и на пальцах, о том, как можно использовать PGP в
домашних условиях для шифрования важных данных.

URL: http://dev.sputnikmedia.net/~rulez/files/pgp.article.txt
Новость: http://www.opennet.ru/opennews/art.shtml?num=2793


Содержание

Сообщения в этом обсуждении
"Как сделать небольшую консольную напоминалку паролей на основе PGP."
Отправлено John Doe , 19-Авг-03 19:09 
Внимание!!! Этот ╚чудо скрипт╩ больше похож на Троянского коня.

"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено Sergey Shurin , 19-Авг-03 19:38 
Да ладно... :) Параноя это конечто неплохо, но надо ж чуствовать меру :)
Я думаю почти каждый(и я тоже) использует подобные "велосипеды" но вот человека не обламало описать процесс изготовления.
А трояна там никакого нету - там же 10 строк и из нестандартных команд - только gnupg - чем там троянить? :)

"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено John Doe , 20-Авг-03 02:33 
Раз. Почему Троян?! Эта ╚полезная программа╩ содержит несколько ошибок (надеюсь, что неумышленных), используя которые злоумышленник может произвести несколько различных атак, в результате которых получит ╚защищенные╩ пароли. 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/$$.

Итого. Ошибки, допущенные в ╚чудо программе╩, - элементарны, поэтому и возникает ощущение, что это Троянский конь. Конечно, автор мог допустить их случайно, но тогда он совершенно некомпетентен в области, которую пытался осветить.


"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено Alexander Kulinich , 20-Авг-03 08:08 
Всё так. Не спорю - варианты взлома хоть и достаточно абсурдны, но реальны.
Немного изменил скрипт:
#!/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. Может вы мне подскажете, что за область я хотел осветить? :)


"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено Alexander Kulinich , 20-Авг-03 08:15 
Тьху, блин, пора спать :)
Естественно - не
TMP_FILE=/tmp/'echo date | md5'
а
TMP_FILE=/tmp/'date | md5'
или даже так:
TMP_FILE=/tmp/'echo `date`$$ | md5'

"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено Alexander Kulinich , 20-Авг-03 08:47 
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}`

"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено John Doe , 20-Авг-03 21:05 
Забавно. Все приводимые заплатки выглядят внушительно (складывается ощущение, что проблемы решены), а на самом деле бесполезны.

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?


"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено Alexander Kulinich , 21-Авг-03 10:09 
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 не нашел, потому не игрался.

А к вопросу со "злым рутом" - "злой рут" может и скрипт подправить так, чтобы без извратов оно ему куда надо все пароли сложило.

Выход один - не иметь на машине других пользователей с рутовымы правами.


"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено Sergey Shurin , 21-Авг-03 12:12 
> vim -c 'read !gpg -d  -q' ${TMP_FILE} && \

Small bug fix:
vim -c 'read !cat ${FILE} | gpg -d -q' ${TMP_FILE} && \


"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено poige , 20-Авг-03 11:23 
>В любом случае - я не ставил себе задачей написать универсальную и
>абсолютно безопастную утилиту, как не ставил задания писать Троянского

"безопасность". Нет там никакой "Т" inside. :)

/poige
--
http://www.i.morning.ru/~poige/


"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено Sergey Shurin , 20-Авг-03 11:52 

:))))))))))))

AHTUNG!!! Данный скрипт не рекомендуется использовать на машинах, на                                  
которых рут есть у кого-либо кроме вас - это вполне серьёзно.                                          
Кроме того дисковую систему, на которой использовался данный скрипт,                                  
нельзя выбрасывать. Её надо утопить в горячей домне, при этом убедившись                              
в _полном_ уничтожении. Иначе, злоумышленник, используя "недавние                                      
достижения NIST в туннельной электронной микроскопии (Bruce Schneier,                                  
Applied Cryptography, 2002)" сможет восстановить ваши пароли.


"Как сделать небольшую консольную напоминалку паролей на основе PGP."
Отправлено Nikolaev D. , 20-Авг-03 08:59 
to:John Doe

Согласен, "чудо скрипт" - троян.
Принцип действия - социальный инжиринг.


"Как сделать небольшую консольную напоминалку паролей на основе PGP."
Отправлено Аноним , 20-Авг-03 16:14 
Господа, насчет абстрактного злоумышленника... а кто мешает $HOME/tmp вместо /tmp использовать?
кажется никто

"Как сделать небольшую консольную напоминалку паролей на основе PGP."
Отправлено Nikolaev D. , 20-Авг-03 17:27 
>а кто мешает $HOME/tmp вместо /tmp использовать?
А то, что:
1. такой директории может не быть(но можно создать, а если $HOME - корень например ???)
2. Идеология не верна в принципе - если на ФС записан файл с НЕШИФРОВННЫМИ паролями, то rm -rf file удаляет метку, но не ДАННЫЕ. Уверенным можно быть, ТОЛЬКО после прохода dd по всему диску. А если $HOME монтируется по NFS к примеру ?

И вообще:
crypt > passwods.file
Вводим текст

crypt < passwords.file
получаем текст


"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено Sergey Shurin , 20-Авг-03 18:00 
Чего-то мне кажется, что чегo-то типа John the Ripper прочитает ваш password.file аж на ура :-\
В то время как ПГП с двухкилобайтным ключем ФСБ будет ламать пару недель.

"Как сделать небольшую консольную напоминалку паролей на основе PGP."
Отправлено Аноним , 20-Авг-03 18:53 
shred /dev/hda

"Как сделать небольшую консольную напоминалку паролей на основе PGP."
Отправлено Nikolaev D. , 21-Авг-03 10:14 
>Чего-то мне кажется, что чегo-то типа John the Ripper прочитает ваш password.file аж на ура

Полностью согласен - стойкость никакая. Так что пароли надо хранить в памяти человека :)


"Как сделать небольшую консольную напоминалку паролей на осно..."
Отправлено Андрей , 21-Авг-03 10:54 
И память перидически освежать - зажав ему (юзеру)пальцы в тиски, или иголки под ногти.....я просто про то что это всё класс , но мы прийдём всё к тому же - самое слабое место человек.

"Адрес статьи изменился"
Отправлено Alexander Kulinich , 16-Мрт-07 12:45 
Новый адрес: http://rulez.kiev.ua/files/articles/pgp.html