воскресенье, 26 января 2014 г.

Эксплойт для обхода ограничений full disk encryption

Greg Kroah-Hartman упомянул эксплойт для обхода защиты full disk encryption. Для успешной эксплуатации уязвимости нужен физический доступ к компьютеру и диск должен быть разблокирован (введен пароль дешифровки диска). Для защиты ваш компьютер должен быть выключен или находиться в состоянии suspend to disk (hibernate). Более радикальным вариантом защиты будет блокировка или удаление драйверов FireWire из операционной системы.

Суть уязвимости заключается в том, что firewire шина позволяет получить прямой доступ к памяти хоста (нижние 4GB памяти) через запрос DMA (протокол SBP-2). После этого аппаратная отмычка сканирует память хоста и патчит механизм проверки пароля. Результатом успешной атаки является возможность авторизоваться по любому паролю.

Если вы считаете, что отсутствие порта firewire вас защитит, то прочтите ответы 5 и 7 в FAQ.

Чтобы отключить поддержку FireWire в Linux (инструкция для свежих ядер) добавьте в файл /etc/modprobe.d/blacklist.conf строки

blacklist firewire-core
blacklist firewire-ohci
blacklist firewire-sbp2

Выгрузите модули из памяти и обновите образ initramfs

# modprobe -r firewire-ohci
# update-initramfs -u -k all

пятница, 24 января 2014 г.

Преобразование формата даты 24/Jan/2014 в 2014-01-24

В процессе написания парсера логов мне потребовалось преобразовывать формат дат в shell скрипте. В логе дата указывается в виде 24/Jan/2014, а мне нужна 2014-01-24. Для преобразования формата даты я написал функцию convert_date()

# Convert date format from %d/%b/%Y to %Y-%m-%d (strftime notation)
convert_date() {
    date --date="$(echo $1 | awk -F '/' '{print $2" "$1" "$3}')" +'%Y-%m-%d'
}

Пример использования

STAMP=$(convert_date 24/Jan/2014)

понедельник, 20 января 2014 г.

Неправильный порядок nameserver'ов в /etc/resolv.conf при работе NetworkManager через resolvconf

Недавно подключался к корпоративной сети в "полевых" условиях и наткнулся на несовместимость NetworkManager (0.9.4.0-10) и resolvconf (1.67) в Debian Wheezy. Проблема известная, но патча или какого-то грамотного workaround'а я не увидел.

Если кратко, то записи о nameserver'ах в /etc/resolv.conf прописываются в неверном порядке если для подключения к сетям использовать NetworkManager. Если подробнее, то NetworkManager неправильно взаимодействует с resolvconf и передает неверное с точки зрения resolvconf имя интерфейса (точнее сказать не передает совсем). Resolvconf требует указывать название интерфейса и название программы, которая обновляет информацию о резолверах (например /sbin/resolvconf -a ppp0.pppd). При этом добавление записи в /etc/resolv.conf выполняется согласно порядку интерфейса в /etc/resolvconf/interface-order.

Например вы подключились через 3G модем к сотовому оператору и название вашего интерфейса ppp0. Сотовый оператор выдает два nameserver'а (x.x.x.1 и x.x.x.2). Далее вы подключаетесь к корпоративной сети VPN и вам выдает еще два nameserver'a (y.y.y.1 и y.y.y.2). Чтобы все работало правильно нужно чтобы /etc/resolv.conf выглядел так:

nameserver y.y.y.1
nameserver y.y.y.2
nameserver x.x.x.1
nameserver x.x.x.2

Но вместо этого в /etc/resolv.conf записи выглядят так:

nameserver x.x.x.1
nameserver x.x.x.2
nameserver y.y.y.1
nameserver y.y.y.2

Поскольку корпоративные nameserver'а оказались в конце списка, то внутренние ресурсы оказываются недоступными.

В процессе изучения проблемы оказалось, что NetworkManager использует вызов /sbin/resolvconf -a NetworkManager (указывает все nameserver'а без указания принадлежности к интерфейсу). Один из вариантов - изменить файл /etc/resolvconf/interface-order, чтобы явно задать приоритет NetworkManager, но поскольку это NM не следует соглашению, то я решил поправить его код.

Нужный мне участок кода быстро нашелся в файле NetworkManager/src/dns-manager/nm-dns-manager.c. Для добавления и удаления записей через resolvconf используется функция dispatch_resolvconf()

#ifdef RESOLVCONF_PATH
static gboolean
dispatch_resolvconf (const char *domain,
                     char **searches,
                     char **nameservers,
                     const char *iface,
                     GError **error)
{
 char *cmd;
 FILE *f;
 gboolean retval = FALSE;

 if (! g_file_test (RESOLVCONF_PATH, G_FILE_TEST_IS_EXECUTABLE))
  return FALSE;

 if (domain || searches || nameservers) {
  cmd = g_strconcat (RESOLVCONF_PATH, " -a ", "NetworkManager", NULL);
  nm_log_info (LOGD_DNS, "(%s): writing resolv.conf to %s", iface, RESOLVCONF_PATH);
  if ((f = popen (cmd, "w")) == NULL)
   g_set_error (error,
                NM_DNS_MANAGER_ERROR,
                NM_DNS_MANAGER_ERROR_SYSTEM,
                "Could not write to %s: %s\n",
                RESOLVCONF_PATH,
                g_strerror (errno));
  else {
   retval = write_resolv_conf (f, domain, searches, nameservers, error);
   retval &= (pclose (f) == 0);
  }
 } else {
  cmd = g_strconcat (RESOLVCONF_PATH, " -d ", "NetworkManager", NULL);
  nm_log_info (LOGD_DNS, "(%s): removing resolv.conf from %s", iface, RESOLVCONF_PATH);
  if (nm_spawn_process (cmd) == 0)
   retval = TRUE;
 }

 g_free (cmd);

 return retval;
}
#endif

В выделенных строках видно какую команду выполняет NetworkManager. Чтобы исправить ситуацию достаточно добавить название интерфейса, который получает функция. Патч получился тривиальный

--- NetworkManager/src/dns-manager/nm-dns-manager.c.orig 2014-01-16 12:10:52.265616559 +0300
+++ NetworkManager/src/dns-manager/nm-dns-manager.c 2014-01-16 12:15:09.069611996 +0300
@@ -416,7 +416,7 @@ dispatch_resolvconf (const char *domain,
   return FALSE;
 
  if (domain || searches || nameservers) {
-  cmd = g_strconcat (RESOLVCONF_PATH, " -a ", "NetworkManager", NULL);
+  cmd = g_strconcat (RESOLVCONF_PATH, " -a ", iface, ".NetworkManager", NULL);
   nm_log_info (LOGD_DNS, "(%s): writing resolv.conf to %s", iface, RESOLVCONF_PATH);
   if ((f = popen (cmd, "w")) == NULL)
    g_set_error (error,
@@ -430,7 +430,7 @@ dispatch_resolvconf (const char *domain,
    retval &= (pclose (f) == 0);
   }
  } else {
-  cmd = g_strconcat (RESOLVCONF_PATH, " -d ", "NetworkManager", NULL);
+  cmd = g_strconcat (RESOLVCONF_PATH, " -d ", iface, ".NetworkManager", NULL);
   nm_log_info (LOGD_DNS, "(%s): removing resolv.conf from %s", iface, RESOLVCONF_PATH);
   if (nm_spawn_process (cmd) == 0)
    retval = TRUE;

После пересборки пакетов и обновления системы приоритет nameserver'ов правильный.

P.S. К сожалению этот патч не будет работать на последней версии NetworkManager, поскольку там изменился прототип функции dispatch_resolvconf() и имя интерфейса более не передается. Позже попробую закинуть им баг на эту тему.

среда, 15 января 2014 г.

Не знаете где взять редкий винт для ноутбука?

Если вам тоже не хватило какого-то мелкого винтика для ноутбука - не расстраивайтесь. Попробуйте заглянуть в ненужный cd/dvd привод - почти наверняка там найдется что-то подходящее. Я так себе вчера вечером нашел винт для крепления WWAN карты в своем ноутбуке.

А на будущее стоит заказать наборчик вроде этого - хватит надолго и знакомым можно будет отсыпать в случае чего.

понедельник, 13 января 2014 г.

Обновление BIOS на Dell Latitute E6410


Этот пост ориентирован на технически грамотную аудиторию. Если вы не обладаете необходимыми навыками - не пытайтесь повторить описанное. Я не несу никакой ответственности за ваши ошибки или возможный ущерб, возникший в следствии попытки повторить описанное.

Долго не мог решиться обновить BIOS в своем Dell Latitude E6410, но на прошлой неделе вышло очередное обновление A16 и я решил попробовать. Серьезных проблем с ноутбуком не было, но мелкие косяки иногда давали о себе знать. Пару раз при перезагрузке ноутбук выдавал ошибку процессора (мигает Num lock и горят Caps Lock и Scroll lock - на языке документации Dell это состояние называется FLASH-ON-ON). Еще есть известная проблема с динамическим управлением частотой процессора после выхода из S3 режима, при отключенном сетевом адаптере.

До обновления версия BIOS была A06 и производитель рекомендует обновляться до свежего релиза в три этапа:
Notes:
--------
1. Please note that if the A01 BIOS is currently installed on your system you must
first apply the P02 patch (E6410P02.EXE) before upgrading to this BIOS.
2. Please note that if the A08 or before A08 BIOS is currently installed on your system
you must first update to A09 BIOS and then flash to the latest A-rev BIOS.
3. Please note that if the A10 or before A10 BIOS is currently installed on your system
you must first update to A11 BIOS and then flash to the latest A-rev BIOS.

Следовательно нужно сначала обновиться с A06 до A09, затем до A11 и окончательно до A16.

Обновления BIOS доступны в виде EXE файлов, которые можно выполнить в Windows или DOS. Поскольку у меня нет установленной Windows, то я выбрал вариант с обновлением через DOS (FreeDOS).

Я не буду описывать весь процесс подготовки загрузочной флешки, готовый образ для записи на флешку можно скачать тут. После скачивания распаковать образ можно так (/dev/sdb - название устройства вашей флешки, если у вас другое, то измените команды соответственно):

$ wget http://www.tataranovich.com/public/dell/e6410_bios_update.img.gz
$ wget http://www.tataranovich.com/public/dell/MD5SUMS
$ md5sum -c MD5SUMS
e6410_bios_update.img.gz: ЦЕЛ
$ gunzip e6410_bios_update.img.gz
$ dd if=e6410_bios_update.img of=/dev/sdb

Не продолжайте дальше, если у вас не совпала контрольная сумма.

После подготовки нужно загрузиться с флешки и выбрать вариант загрузки "4 - Load FreeDOS without drivers"


Затем ввести в командной строке "E6410A09.EXE" и выполнить обновление до ревизии A09.


Далее аналогичным образом обновиться до A11 (E6410A11.exe) и A16 (E6410A16.exe).

Этот пост ориентирован на технически грамотную аудиторию. Если вы не обладаете необходимыми навыками - не пытайтесь повторить описанное. Я не несу никакой ответственности за ваши ошибки или возможный ущерб, возникший в следствии попытки повторить описанное.

среда, 8 января 2014 г.

Выборочная отмена изменений в конфигурации сервера, которые были сделаны давно

Когда-то давно я устанавливал pnp4nagios, чтобы решить что я буду использовать для мониторинга изменений параметров своего домашнего сервера. В тот раз я выбрал на эту роль Munin, но удаление уже ненужного pnp4nagios отложил до лучших времен. Сейчас есть свободная минутка и я решил потренироваться в выборочной отмене изменений конфигурации сервера.

Сначала удаляю пакеты, принадлежащие pnp4nagios и затем конфигурацию всех пакетов, которые были автоматически установлены для pnp4nagios.

$ sudo aptitude purge '~i pnp4nagios'
$ sudo aptitude purge '~c'

Теперь нужно отменить изменения в /etc, которые были сделаны для интеграции уже установленного Nagios с pnp4nagios. Для контроля за изменениями в /etc у меня используется etckeeper, но поскольку я не помню когда и какие изменения я внес, то пробую поискать в истории изменений.

$ sudo etckeeper vcs log | grep -B3 -i pnp4nagios
набор изменений:  281:1d3749d4f348
пользователь:     andrey@server.home.tataranovich.com
дата:             Wed May 08 16:03:27 2013 +0300
сводка:           Before pnp4nagios debugging.
--
набор изменений:  280:e44540a69bf4
пользователь:     Andrey Tataranovich 
дата:             Wed May 08 16:02:33 2013 +0300
сводка:           Installed pnp4nagios.

Итак, pnp4nagios я устанавливал весной прошлого года. Поскольку после этого уже было внесено много изменений, то просто откатить весь /etc на состояние предшествующее установке пакетов нельзя. Нужно отменить только изменения, связанные с настройкой интеграции nagios и pnp4nagios. Etckeeper всегда делает комит состояния /etc до и после работы менеджера пакетов - следовательно мне нужно найти комит, соответствующий состоянию до начала установки пакетов pnp4nagios. Для верности беру 5 ревизий, предшествующих e44540a69bf4.

$ sudo etckeeper vcs log -r e44540a69bf4~5: -l 6
набор изменений:  275:ad2066d36826
пользователь:     @server.home.tataranovich.com
дата:             Sun May 05 06:54:28 2013 +0300
сводка:           daily autocommit

набор изменений:  276:15ddfe25a664
пользователь:     @server.home.tataranovich.com
дата:             Tue May 07 06:31:12 2013 +0300
сводка:           daily autocommit

набор изменений:  277:a7dd8e2fa616
пользователь:     @server.home.tataranovich.com
дата:             Wed May 08 06:42:30 2013 +0300
сводка:           daily autocommit

набор изменений:  278:b24e999300fe
пользователь:     andrey@server.home.tataranovich.com
дата:             Wed May 08 09:30:35 2013 +0300
сводка:           saving uncommitted changes in /etc prior to apt run

набор изменений:  279:6107c041a05b
пользователь:     andrey@server.home.tataranovich.com
дата:             Wed May 08 09:30:47 2013 +0300
сводка:           committing changes in /etc after apt run

набор изменений:  280:e44540a69bf4
пользователь:     Andrey Tataranovich 
дата:             Wed May 08 16:02:33 2013 +0300
сводка:           Installed pnp4nagios.

В данном случае меня интересует b24e999300fe, который был зафиксирован перед вызовом apt. Теперь осталось получить все изменения в /etc/nagios3, сделанные после.

$ sudo etckeeper vcs diff -r b24e999300fe: /etc/nagios3 > /tmp/pnp4nagios.diff

Теперь нужно проверить diff-файл /tmp/pnp4nagios.diff - возможно туда попали лишние изменения, которые не связаны с интеграцией pnp4nagios - у меня такие были и я отредактировал файл, чтобы он содержал только нужные мне изменения. В результате получилось так:

cat /tmp/pnp4nagios.diff 
diff -r b24e999300fe -r 024b430644d3 nagios3/conf.d/generic-host_nagios2.cfg
--- a/nagios3/conf.d/generic-host_nagios2.cfg   Wed May 08 09:30:35 2013 +0300
+++ b/nagios3/conf.d/generic-host_nagios2.cfg   Wed Jan 08 09:36:12 2014 +0300
@@ -15,5 +15,6 @@
                notification_period             24x7
                notification_options            d,u,r
                contact_groups                  admins
+       action_url                      /pnp4nagios/graph?host=$HOSTNAME$
         register                        0       ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
         }
diff -r b24e999300fe -r 024b430644d3 nagios3/conf.d/generic-service_nagios2.cfg
--- a/nagios3/conf.d/generic-service_nagios2.cfg        Wed May 08 09:30:35 2013 +0300
+++ b/nagios3/conf.d/generic-service_nagios2.cfg        Wed Jan 08 09:36:12 2014 +0300
@@ -22,5 +22,6 @@
                notification_period             24x7
                notification_options            w,u,c,r
                contact_groups                  admins
+       action_url                      /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
         register                        0       ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!
         }
diff -r b24e999300fe -r 024b430644d3 nagios3/nagios.cfg
--- a/nagios3/nagios.cfg        Wed May 08 09:30:35 2013 +0300
+++ b/nagios3/nagios.cfg        Wed Jan 08 09:36:12 2014 +0300
@@ -248,6 +248,7 @@
 
 #broker_module=/somewhere/module1.o
 #broker_module=/somewhere/module2.o arg1 arg2=3 debug=0
+broker_module=/usr/lib/pnp4nagios/npcdmod.o config_file=/etc/pnp4nagios/npcd.cfg
 
 
 
@@ -832,7 +833,7 @@
 # performance data.
 # Values: 1 = process performance data, 0 = do not process performance data
 
-process_performance_data=0
+process_performance_data=1
 
 


Пробуем отменить этот "патч".

$ cd /etc
$ sudo patch -p1 -R --dry-run < /tmp/pnp4nagios.diff 
patching file nagios3/conf.d/generic-host_nagios2.cfg
patching file nagios3/conf.d/generic-service_nagios2.cfg
patching file nagios3/nagios.cfg

Проверка завершилась успешно и теперь можно применить изменения и зафиксировать их в etckeeper.

$ sudo patch -p1 -R < /tmp/pnp4nagios.diff
patching file nagios3/conf.d/generic-host_nagios2.cfg
patching file nagios3/conf.d/generic-service_nagios2.cfg
patching file nagios3/nagios.cfg
$ sudo service nagios3 check && service nagios3 restart
$ sudo etckeeper commit

воскресенье, 5 января 2014 г.

Печать на конвертах для CD/DVD дисков

Чтобы украсить диск с записью утренника в детском саду у ребенка, я решил освоить печать на бумажном конверте для CD/DVD дисков. Я имею ввиду те конверты для CD/DVD дисков, которые целиком из бумаги - конверты с прозрачным окошком не подойдут! (не пытайтесь печатать на конвертах с прозрачным окошком в лазерном принтере - скорее всего ваши действия приведут к дорогостоящему ремонту).

Размер конверта 125x125мм и первым делом я уменьшил размер подающего лотка в принтере, чтобы он ровно держал конверт и не давал ему смещаться. После этого я создал новый документ в LibreOffice и изменил свойства страницы документа (Формат / Страница)


Подобные настройки печати дают область печати размером 105x105мм.

Далее создается макет страницы - у меня получилось примерно так


По окончании в лоток принтера кладется конверт (карман конверта должен быть закрыт и направлен внутрь принтера) и выполняется печать. Результат получился вполне приличным.

пятница, 3 января 2014 г.

Отключение показа new tab page в Firefox

При создании нового таба в Firefox показывается страница с превьюшками наиболее посещаемых страниц. Мозиловцев уже как-то ругали за публичный показ важной/приватной информации, после чего firefox перестал добавлять превью для https страниц и снизил качество самих превью.

Лично мне не нравится сама идея такого показа. Чтобы отключить эту страницу, нужно:
  • зайти в расширенные настройки "about:config" в строке браузера;
  • согласиться с предупреждением (если оно у вас еще включено);
  • найти параметр browser.newtabpage.enabled (boolean) и установить его значение в false.
После этого браузер будет показывать чистую страницу при создании нового таба.