Статьи из рубрики «c-cpp»
Советы и программы на C/C++ для разных операционных систем.
- Qt (3)
ngx_drop_privs: принцип минимальных привилегий в nginx
nginx — замечательный web-сервер, но, как и практически любой программный продукт, не свободен от ошибок, временами весьма критических.
Архитектура nginx такова, что обычно имеется один привилегированный процесс (запускаемый от всемогущего root) и один или более рабочих процессов (обычно работающих от имени непривилегированного пользователя). Тем не менее, я видел конфигурации, в которых все процессы nginx работают под привилегированным пользователем. Один из примеров — многопользовательский сервер, Document Root сайтов на котором имеет права вида 0700 (запускать несколько nginx и настраивать проксирование — тоже не лучший выход).
Кроме того, за последние неполные пять лет в nginx найдено 112 ошибок (segmentation fault), некоторые из которых теоретически могут дать возможность выполнения произвольного кода в системе (wget http://sysoev.ru/nginx/changes.html -q -O - | grep segmentation | wc -l).
Я не знаю, все ли ошибки затрагивали только рабочие процессы, либо были ошибки в главном процессе — рисковать не хочется. Так и родилась идея написать модуль для nginx — ngx_drop_privs. Далее »
Сен
2009
Расширения PHP и Doxygen
Любимые разработчиками PHP макросы и их уровень вложенности зачастую оказываются плохо совместимыми с системой документирования исходных текстов Doxygen.
В зависимости от настроек препроцессора Doxygen (в частности, директивы SKIP_FUNCTION_MACROS) отдельные блоки кода могут быть вообще пропущены; например, в коде:
STD_PHP_INI_BOOLEAN("chuid.disable_posix_setuid_family", "1", PHP_INI_SYSTEM, OnUpdateBool, disable_setuid, zend_chuid_globals, chuid_globals)
STD_PHP_INI_BOOLEAN("chuid.never_root", "1", PHP_INI_SYSTEM, OnUpdateBool, never_root, zend_chuid_globals, chuid_globals)
STD_PHP_INI_BOOLEAN("chuid.cli_disable", "1", PHP_INI_SYSTEM, OnUpdateBool, cli_disable, zend_chuid_globals, chuid_globals)
STD_PHP_INI_BOOLEAN("chuid.be_secure", "1", PHP_INI_SYSTEM, OnUpdateBool, be_secure, zend_chuid_globals, chuid_globals)
STD_PHP_INI_ENTRY("chuid.default_uid", "65534", PHP_INI_SYSTEM, OnUpdateLong, default_uid, zend_chuid_globals, chuid_globals)
STD_PHP_INI_ENTRY("chuid.default_gid", "65534", PHP_INI_SYSTEM, OnUpdateLong, default_gid, zend_chuid_globals, chuid_globals)
STD_PHP_INI_ENTRY("chuid.global_chroot", NULL, PHP_INI_SYSTEM, OnUpdateString, global_chroot, zend_chuid_globals, chuid_globals)
PHP_INI_END()
Блок PHP_INI_BEGIN()…PHP_INI_END() может быть рассмотрен как функциональный макрос и проигнорироваться Doxygen. Либо, если директива SKIP_FUNCTION_MACROS установлена в No, распознать декларации PHP_INI_BEGIN() и ZEND_DECLARE_MODULE_GLOBALS() как функции.
У меня не получилось никаким настройками (кроме ручного задания соответствия макросов) заставить Doxygen развернуть макросы из zend_module_entry или всякие PHP_MINIT_FUNCTION. Далее »
Сен
2009
Последовательность инициализации и сброса в расширениях PHP
Я сейчас занимаюсь написанием расширения PHP, которое меняет UID/EUID (а также GID/EGID) процесса PHP-интерпретатора на UID/GID владельца DocumentRoot сайта. При этом по замыслу расширение должно отключаться, если SAPI не используется (например, запущена CLI-версия интерпретатора).
Для этой задачи оказалось важным знать точную последовательность инициализации и финализации. Далее »
Автор: Vladimir, опубликовано в: C/C++, PHP, комментариев: нетАвг
2009
dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed: Часть 2
Вчера я писал об ошибке в dk-filter, приводящей к гибели процесса, если dk-filter сконфигурирован использовать разные ключи для подписи сообщений от разных отправителей, и ключ для отправителя не найден.
Я предложил два решения: тривиальное (изменить файл конфигурации так, чтобы все отправители начинались со звёздочки) и правильное (пропатчить код демона, ибо фатальное завершение по такой пустяковой ошибке — это неправильно).
Именно о втором решении далее пойдёт речь. Далее »
Автор: Vladimir, опубликовано в: C/C++, Linux, Администрирование, комментариев: нетИюл
2009
GCC: освобождение ресурсов для ленивых
Одной из, скажем так, «нетрадиционных» возможностей, которые предоставляет GCC, являются атрибуты типов, переменных и функций.
Я хочу рассказать об одном из них — а именно, отвечающем за удаление использованных ресурсов. Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: 2Июн
2009
PHP: зависимости времени выполнения между расширениями
Так (как, кстати, рекомендует Sara Golemon) нельзя:
static zend_module_dep php_afs_depencies[] ={
ZEND_MODULE_REQUIRED("krb5");
{NULL,NULL,NULL}
}
#endif
Потому что даже не скомпилируется, если с ZEND_MODULE_API_NO (не) повезёт. Далее »
Май
2009
О пользе избыточной инициализации, или, В исходный код смотреть вредно
То, что данные нужно инициализировать перед использованием, знают все. Но иногда правильная инициализация — хитрая штука. Я с этим столкнулся, когда писал расширение для PHP, работающее с Voxel Hosting API.
Одна из проблем PHP — плохая документация (отсутствие таковой) по внутреннему API. А из кода Zend Engine не всегда всё однозначно ясно, чо временами приводит к очень милым ошибкам вида «фиг ты меня найдешь» (смягчено из соображений цензуры).
Об одной из таких особенностей я хочу рассказать. Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: нетМай
2009
Параллельная версия генерации и проверки подписи по алгоритму DSA
DSA — алгоритм для создания и проверки электронной подписи с использованием открытого ключа, основанный на вычислительной сложности взятия логарифмов в конечных полях.
Алгоритмы, использующие «большие числа» — всегда хорошие кандидаты на распараллеливание. Дело в том, что даже при современной мощности процессоров многие задачи являются довольно сложными с вычислительной точки зрения. Хотя криптографические алгоритмы, как правило, очень тяжело поддаются распараллеливанию (например, когда значение, вычисленное на предыдущем шаге алгоритма, используется на текущем шаге), чисто математические задачи все же дают определённый простор для распараллеливания.
В данной статье рассмотрим возможность распараллеливания алгоритма DSA. Далее »
Автор: Vladimir, опубликовано в: C/C++, OpenMP, Безопасность, комментариев: 1Май
2009
Полиморфизм времени компиляции без использования виртуальных функций
Рассмотрим такой фрагмент кода:
struct A {
A() {};
~A() { ::std::cout < < "A::~A()\n"; }
};
struct B : public A {
B() {};
~B() { ::std::cout << "B::~B()\n"; }
};
int main(void)
{
{
const A& a = B();
}
return 0;
}
Апр
2009
И снова о простых числах Софи Жермен
Год назад я писал о генерации простых чисел Софи Жермен.
Вкратце напомню: p — простое число Софи Жермен, если q = 2p+1, тоже простое число. Простые числа Софи Жермен применяются в криптографии (в частности, в протоколе обмена ключами Диффи–Хеллмана–Меркле). Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: 4Апр
2009
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.

