книги хакеры / журнал хакер / 207_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
номера inode при создании файлов назначаются случайным образом, системный |
|
. |
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
вызов bind() использует случайные порты для привязки сокетов, начальные номера последовательности в TCP-соединении всегда случайны, timestamp’ы случайны. Все это сделано для того, чтобы максимально усложнить жизнь взломщику.
Вторая идея — всесторонняя борьба с атаками, направленными на срыв стека. Первая линия обороны здесь — это уже ставший стандартом принцип privilege separation, когда приложение получает необходимые ему повышенные полномочия (права root) только на короткие промежутки времени, так что взломщик приложения не сможет раздобыть права root в большинстве случаев. Лучший пример здесь — это OpenSSH, который работает попеременно на трех «уровнях доступа»: monitor, в котором ему доступны права root, slave — когда код работает с правами специального юзера sshd, и второй вариант slave, когда OpenSSH обслуживает пользовательскую сессию и работает с его правами.
Разделение
привилегий в OpenSSH
Вторая линия обороны — безопасные версии функций Libc и -fstack- protector. Когда-то, чтобы решить проблему переполнения буфера при использовании функций strcpy() и strcat(), в библиотеку Libc были введены функции strncpy() и strncat(), позволяющие ограничить размер копируемых данных и не допустить переполнения. Однако сами эти функции также оказались уязвимыми и в случае неправильного использования тоже приводили к выходу за границы буфера. По этой причине разработчики OpenBSD реализовали собственные «правильные» версии функций под названием strlcpy() и strlcat() и перевели на их использование все компоненты ОС.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
OpenBSD также была одной из первых систем с принудительной сборкой |
|
. |
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
всех приложений компилятором GCC с включенной опцией ProPolice (аргумент командной строки -fstack-protector). Данный механизм слегка модифицирует код приложения перед окончательной сборкой, а именно заставляет его размещать в стеке случайный набор данных (canary) перед вызовом небезопасных функций и проверять его наличие после совершения вызова. В случае срыва стека canary будет затерт, приложение это заметит и просто завершится.
Данный метод защиты сегодня используется практически во всех ОС, включая все BSD и ведущие дистрибутивы Linux. Но разработчики OpenBSD пошли еще дальше: в дополнение к -fstack-protector они реализовали в ядре механизм, внедряющий небольшой «разрыв» случайного размера в начале стека, так что, если атакующий использует классический прием срыва стека, заставляя приложение исполнять шелл-код, находящийся в самом стеке, он потерпит неудачу, поскольку не будет знать, по какому адресу находится этот код.
Третья линия — ASLR, randomized malloc() и W^X. OpenBSD стала первой ОС с включенным по умолчанию механизмом ASLR. Последний позволяет рандомизировать адреса регионов памяти процесса (таких как стек, куча, область данных), кода и библиотечных функций. В результате выполнить некоторые типы атак, например ret2libc, стало практически невозможно. Кроме того, в OpenBSD имеется уникальный механизм рандомизации кучи путем выделения случайных регионов памяти при вызове malloc() (вместо ее простого расширения).
malloc()
с рандомизацией
Еще одна уникальная для OpenBSD функция — это W^X (write or execute). Она гарантирует, что страница памяти процесса одновременно может быть либо записываемой, либо исполняемой, но не оба варианта сразу. Это обеспечивает, например, что внедренный в стек шелл-код не будет выполнен (так как стек — записываемая область памяти). На современных платформах W^X использует специальный NX-бит (No eXecute), появившийся в 64-разрядных процессорах
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
Intel и AMD, и в этом нет ничего уникального (Linux делает то же самое), однако |
|
. |
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
вOpenBSD такая защита работает даже на 32-битных процессорах i386.
Вцелом уровень защитных механизмов OpenBSD довольно параноидален. Дело доходит даже до того, что по умолчанию шифруется раздел подкачки, причем вовсе не для галочки. Swap-раздел разбивается на небольшие участки, каждый из которых шифруется собственным случайным ключом. Освобождение и «очистка» занятых участков происходит с помощью отзыва ключа.
Но и это еще не все. В последних релизах разработчики пошли дальше и начали выпиливать из ядра вполне полезный, но несущий проблемы с безопасностью код. Так, из версии 5.7 были убраны поддержка модулей ядра (чтобы никто не загрузил ядерный бэкдор) и виртуальная ФС /proc (чтобы никто не подсматривал за чужими процессами), а в текущем коде уже исчезла поддержка эмуляции Linux. Справедливости ради стоит отметить, что в OpenBSD данные механизмы никогда не были особо нужны и рядовой пользователь даже не заметит их отсутствия.
СОФТ
В рамках проекта OpenBSD развивается не только ОС, но и внушительное количество субпроектов. Один из таких проектов — это, конечно же, OpenSSH, но на нем мы останавливаться не будем. Также у проекта есть свой собственный SMTP-сервер (OpenSMTPD), веб-сервер (httpd), спам-фильтр (spamd) и даже менеджер окон (cwm). В OpenBSD интегрирован PF — один из самых продвинутых брандмауэров, который был портирован во все остальные BSD-системы, OS X, iOS и QNX.
Софт, развиваемый в рамках проекта OpenBSD
OpenSSH — самая известная и популярная реализация протокола SSH.
•LibreSSL — форк OpenSSL, очищенный от устаревших алгоритмов, поддержки устаревших ОС и мертвого кода.
•OpenSMTPD — SMTP-сервер с поддержкой PAM, Maildir и виртуальных доменов.
•OpenNTPD — простой NTP-сервер (Network Time Protocol).
•httpd — легкий HTTP-сервер с поддержкой CGI и HTTPS.
•relayd — балансировщик нагрузки и прокси.
•dhclient — реализация DHCP-клиента.
•OpenBGPD — реализация протокола BGP-4 (Border Gateway Protocol).
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
m |
|
|
w Click |
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
Иногда возникает ошибка Failed |
to open audio device(/dev/dsp): No |
|
. |
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
such file or directory. Это значит, что поддержка OSS в ядре не включена. Необходимо включить ее — смотри FAQ на сайте CMU Sphinx.
Все получится, но не с первого раза...
ТЕСТИРУЕМ SPHINX
По умолчанию Sphinx предлагает нам проверить работу на базовом примере, а именно распознать фразу «go forward ten meters». Воспользуемся утилитой пакетного распознавания pocketsphinx_batch. В составе Sphinx также есть инструмент распознавания речи с микрофона pocketsphinx_continuous (синтаксис ее схож с pocketsphinx_batch). Для удобства работы лучше всего использовать отдельную директорию. Синтаксис команды таков:
# pocketsphinx_batch -argfile argfile 2>./errors
argfile — это имя файла в текущей директории, содержащего все аргументы. Также мы используем стандартную утилиту stderr для удобства перенаправления вывода. Вот содержимое нашего файла argfile:
-hmm /usr/local/share/pocketsphinx/model/hmm/en_US/hub4wsj_sc_8k
-lm /usr/local/share/pocketsphinx/model/lm/en/turtle.DMP
-dict /usr/local/share/pocketsphinx/model/lm/en/turtle.dic
-cepdir /home/saint/sphinx