Статьи из рубрики «c-cpp» RSS

Советы и программы на C/C++ для разных операционных систем.

Дочерние рубрики:

ngx_drop_privs: принцип минимальных привилегий в 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 — . Далее »

Автор: , опубликовано в: C/C++, Linux, nginx, Безопасность, комментариев: 3
23
Сен
2009

Расширения PHP и Doxygen

Любимые разработчиками макросы и их уровень вложенности зачастую оказываются плохо совместимыми с системой документирования исходных текстов .

В зависимости от настроек препроцессора Doxygen (в частности, директивы SKIP_FUNCTION_MACROS) отдельные блоки кода могут быть вообще пропущены; например, в коде:

[-]
View Code C
PHP_INI_BEGIN()
    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. Далее »

Автор: , опубликовано в: C/C++, PHP, комментариев: нет
6
Сен
2009

Последовательность инициализации и сброса в расширениях PHP

Я сейчас занимаюсь написанием расширения , которое меняет UID/EUID (а также GID/EGID) процесса -интерпретатора на UID/GID владельца DocumentRoot сайта. При этом по замыслу расширение должно отключаться, если SAPI не используется (например, запущена CLI-версия интерпретатора).

Для этой задачи оказалось важным знать точную последовательность инициализации и финализации. Далее »

Автор: , опубликовано в: C/C++, PHP, комментариев: нет
29
Авг
2009

dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed: Часть 2

Вчера я писал об ошибке в dk-filter, приводящей к гибели процесса, если сконфигурирован использовать разные ключи для подписи сообщений от разных отправителей, и ключ для отправителя не найден.

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

Именно о втором решении далее пойдёт речь. Далее »

Автор: , опубликовано в: C/C++, Linux, Администрирование, комментариев: нет
26
Июл
2009

GCC: освобождение ресурсов для ленивых

Одной из, скажем так, «нетрадиционных» возможностей, которые предоставляет , являются атрибуты типов, переменных и функций.

Я хочу рассказать об одном из них — а именно, отвечающем за удаление использованных ресурсов. Далее »

Автор: , опубликовано в: C/C++, комментариев: 2
2
Июн
2009

PHP: зависимости времени выполнения между расширениями

Так (как, кстати, рекомендует Sara Golemon) нельзя:

[-]
View Code C
#if ZEND_MODULE_API_NO >= 220050617
static zend_module_dep php_afs_depencies[] ={
    ZEND_MODULE_REQUIRED("krb5");
    {NULL,NULL,NULL}
}
#endif

Потому что даже не скомпилируется, если с ZEND_MODULE_API_NO (не) повезёт. Далее »

Автор: , опубликовано в: C/C++, комментариев: нет
13
Май
2009

О пользе избыточной инициализации, или, В исходный код смотреть вредно

То, что данные нужно инициализировать перед использованием, знают все. Но иногда правильная инициализация — хитрая штука. Я с этим столкнулся, когда писал расширение для , работающее с Voxel Hosting API.

Одна из проблем PHP — плохая документация (отсутствие таковой) по внутреннему API. А из кода не всегда всё однозначно ясно, чо временами приводит к очень милым ошибкам вида «фиг ты меня найдешь» (смягчено из соображений цензуры).

Об одной из таких особенностей я хочу рассказать. Далее »

Автор: , опубликовано в: C/C++, комментариев: нет
7
Май
2009

Параллельная версия генерации и проверки подписи по алгоритму DSA

 — алгоритм для создания и проверки электронной подписи с использованием открытого ключа, основанный на вычислительной сложности взятия логарифмов в конечных полях.

, использующие «большие числа» — всегда хорошие кандидаты на распараллеливание. Дело в том, что даже при современной мощности процессоров многие задачи являются довольно сложными с вычислительной точки зрения. Хотя криптографические , как правило, очень тяжело поддаются распараллеливанию (например, когда значение, вычисленное на предыдущем шаге алгоритма, используется на текущем шаге), чисто математические задачи все же дают определённый простор для распараллеливания.

В данной статье рассмотрим возможность распараллеливания алгоритма DSA. Далее »

Автор: , опубликовано в: C/C++, OpenMP, Безопасность, комментариев: 1
3
Май
2009

Полиморфизм времени компиляции без использования виртуальных функций

Рассмотрим такой фрагмент кода:

[-]
View Code C++
#include <iostream>

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;
}
Вопрос: что будет выведено в результате выполнения кода? Далее » Автор: , опубликовано в: C/C++, комментариев: нет
29
Апр
2009

И снова о простых числах Софи Жермен

Год назад я писал о генерации простых чисел Софи Жермен.

Вкратце напомню: p — простое число , если q = 2p+1, тоже простое число. Простые числа Софи Жермен применяются в криптографии (в частности, в протоколе обмена ключами Диффи–Хеллмана–Меркле). Далее »

Автор: , опубликовано в: C/C++, комментариев: 4
22
Апр
2009