C C  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Аудит безопасности системного кода

Итоговый тест проверяет полный цикл аудита системного C-кода: модель угроз, ошибки памяти, неоднозначный ввод, исправление причины, комбинацию инструментов и архитектурные ограничения ущерба.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 6 темам.
Вопрос 1 из 30
С чего начать аудит демона, который принимает файлы по сети и запускает внешнюю утилиту?
CПоток данных
network_bytes -> parse_archive -> write_path -> exec_helper
Вопрос 2 из 30
Какие активы особенно важны у привилегированного сервиса обработки архивов?
CКонтекст сервиса
uid=0; input=network; output=/var/lib/service;
Вопрос 3 из 30
Почему данные от авторизованного пользователя всё равно считают недоверенными?
CC17
if(authenticated(user)) parse_untrusted(upload,upload_len);
Вопрос 4 из 30
Что приоритетнее: редкая авария в недостижимом тестовом коде или переполнение длины в сетевом пути до аутентификации?
Вопрос 5 из 30
Какие входы должны войти в модель угроз парсера сложного формата?
CНабор враждебных параметров
len=UINT32_MAX; depth=MAX_DEPTH; fields=MAX_FIELDS;
Вопрос 6 из 30
Какой дефект безопасности возникает при таком преобразовании недоверенной длины перед выделением памяти?
CC17
size_t bytes = count * sizeof(struct item);
struct item *p = malloc(bytes);
if (!p) return ERR_OOM;
for (size_t i = 0; i < count; ++i) read_item(&p[i]);
Вопрос 7 из 30
Почему обнуление указателя в одной переменной не исправляет обращение после освобождения памяти через другие алиасы?
CC17
char *a=malloc(16);
char *b=a;
free(a); a=NULL;
use(b);
Вопрос 8 из 30
Где в этом фрагменте происходит двойное освобождение?
CC17
buf=malloc(n);
if(parse(buf)<0){ free(buf); goto cleanup; }
...
cleanup: free(buf);
Вопрос 9 из 30
Почему результат `realloc(p, n)` нельзя сразу присваивать обратно в `p`?
CC17
p = realloc(p, n);
if (!p) return ERR;
Вопрос 10 из 30
Какой риск создаёт поверхностная копия структуры с владеющим указателем?
CC17
struct packet b=a; /* a.data и b.data совпадают */
Вопрос 11 из 30
Почему проверка существования файла через `access()` перед `open()` создаёт уязвимость?
Вопрос 12 из 30
Как встроенный NUL создаёт расхождение между проверкой и использованием данных?
CC17
/* bytes: "safe.txt\0../secret" */
validate_bytes(buf,n);
open(buf,O_RDONLY);
Вопрос 13 из 30
Что означает полное потребление поля парсером?
Вопрос 14 из 30
Когда нормализовать путь относительно проверки доступа и открытия объекта?
Вопрос 15 из 30
Почему лимит вложенности нужен даже для формально корректного ввода?
CC17
if(depth >= MAX_DEPTH) return ERR_NESTING;
Вопрос 16 из 30
Как исправить переполнение при записи имени в `char name[64]`?
CC17
int set_name(obj *o, const char *s, size_t n) {
    memcpy(o->name, s, n);
    o->name[n] = '\0';
    return 0;
}
Вопрос 17 из 30
В каком состоянии должен остаться объект, если обновление третьего поля не удалось?
Вопрос 18 из 30
Почему подавление предупреждения явным приведением типа не является исправлением?
CC17
size_t n=read_len();
int m=(int)n; /* warning подавили, диапазон не проверили */
Вопрос 19 из 30
Как безопасно исправить обращение после освобождения памяти в асинхронной функции обратного вызова?
Вопрос 20 из 30
Что проверить после исправления ошибки расчёта размера?
Вопрос 21 из 30
Почему фаззер без санитайзера пропускает часть ошибок памяти?
CC17
clang -fsanitize=fuzzer parser.c -o fuzz_parser
Вопрос 22 из 30
Что на самом деле означает 100% покрытия строк?
Вопрос 23 из 30
Какой вход нужно добавить в корпус тестов после находки фаззера?
Вопрос 24 из 30
Почему статический анализ и AddressSanitizer дополняют друг друга?
Вопрос 25 из 30
Какой режим компиляции полезен для проверки безопасности до фаззинга?
CC17
cc -std=c17 -Wall -Wextra -Wconversion -Wformat=2 \
  -fsanitize=address,undefined -fstack-protector-strong -g ...
Вопрос 26 из 30
Почему парсер недоверенного формата полезно запускать с минимальными правами?
Вопрос 27 из 30
Что означает защита в глубину применительно к переполнению буфера?
Вопрос 28 из 30
Как ограничить вход, похожий на архивную бомбу?
CC17
if(total_out>MAX_TOTAL || files>MAX_FILES || depth>MAX_DEPTH) abort_unpack();
Вопрос 29 из 30
Почему внешнюю утилиту безопаснее запускать с фиксированным `argv` и очищенным окружением?
CC17
char *const argv[]={"helper","--input",path,NULL};
char *const envp[]={"PATH=/usr/bin",NULL};
execve("/usr/libexec/helper",argv,envp);
Вопрос 30 из 30
Какой интерфейс уменьшает поверхность атаки библиотеки парсинга?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу