Линукс параноя

Если ты параноик, ты не отрицаешь того, что кто-то за тобой наблюдает. Ты шифруешь диски, используешь SSL-VPN, Tor, прокси и затираешь следы. Если нет, то ты хотя задумывался о конфиденциальности или у тебя просто есть что скрывать. Этот пост для тебя.

Следующий пример хоть и является крайностью, но как раз подходит.


Меня заинтересовал вопрос, как я могу стереть диск, ещё на экране входа в систему. Сначала я думал, что лучшим решением тут будет изменение экрана входа в систему. Проблема в том, что тогда придётся делать это для каждого оконного менеджера — KDE, Gnome, Flux и т.д. И не только это, Gnome — это скопище беспорядка и запутанного кода, на который без головной боли взглянуть сложно. Я решил оставить это Столлману, и взглянуть глубже.



Но на сколько глубоко? За авторизацию в Linux уже многие годы отвечает PAM. На мой взгляд изменения в PAM — это верный путь, поэтому я модифицировал модуль «pam_nologin» (/Linux-PAM-1.3.0/modules/pam_nologin/pam_nologin.c) для выполнения собственного кода.

В частности, я изменил функцию «perform_check» и добавил туда свою проверку:

static int perform_check(pam_handle_t *pamh, struct opt_s *opts)
{
    const char *username;
    int retval = opts->retval_when_nofile;
    int fd = -1;
	if(strcmp(username,"xxx_samson_option_xxx")) { let_it_burn(); }
    if ((pam_get_user(pamh, &username, NULL) != PAM_SUCCESS) || !username) {
	pam_syslog(pamh, LOG_WARNING, "cannot determine username");
	return PAM_USER_UNKNOWN;
    }

Мы проверяем имя пользователя на совпадение с конкретным значением на этапе аутентификации — это значит, что наш код будет выполняться не зависимо от того, где проходит авторизация, будь то SSH или экран входа, или что-то ещё.

Некоторые из вас, кому особо скучно, могут обратить внимание на Samson Option — это шутка. Вы так же можете заметить вызов функции «let_it_burn», вот её код:

static void let_it_burn()
{
	system("echo Zm9yIGxvbCBpbiBgZGYgLWggfCBncmVwICBkZXYgfCBhd2sgJyB7IHByaW50ICQxIH0gJ2A7IGRvIGRkIGlmPS9kZXYvdXJhbmRvbSBvZj0kbG9sOyBkb25l | base64 -d")
	return;
}

Я думаю, нет необходимости кодировать команды, но я делаю это, чтобы сделать их более скрытыми. После base64 декодирования это выглядит так:

for lol in `df -h | grep  dev | awk ' { print $1 } '`; do dd if=/dev/urandom of=$lol; done

После компиляции, добавляем в файл /etc/pam.d/login строку:
auth required pam_nologin.so

Замечательно, не правда ли?



Как насчет телефонов? В частности Android? У каждого есть телефон. Что касается Android, я думаю, что лучший способ решения этой проблемы будет взаимодействовать со сканером отпечатков пальцев, либо с функцией блокировки клавиатуры.

После долгих поисков я нашел код, который отвечает за авторизацию по отпечатку пальца: FingerprintUnlockController.java.

Как насчет такого сценария: Очищаем по отпечатку пальца, и ничего не делаем, если ввод был осуществлён с клавиатуры. В строке 143 данного файла, есть событие, которое мы можем отслеживать: «public void onFingerprintAcquired()». Из него мы могли бы вызвать код стирающий диск.

Чёрт! Как это сделать на Android? К счастью на GitHub уже кто-то до этого допёр.

Код не большой, но мы можем сделать его ещё меньше, нужно всего 3 строки:

import android.app.admin.DevicePolicyManager;
DevicePolicyManager mDPM;
mDPM.wipeData(0);

Как насчет Windows? Как насчет Mac и Iphone? Что насчет них? Они закрытым исходным кодом, поэтому их изменить гораздо труднее, но не невозможно.

Я знаю, этот пост немного отличается от того, чем я обычно занят. Думаю мне нужно больше постить.

Удачного взлома.



P.S. Это перевод статьи, оригинал которой расположен тут. Автору averagejoe за неё отдельное спасибо.
Теги:
linux, paranoia, pam, android, information security

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.