Найдено при аудите «каким событием в мире эту проверку можно уронить».
check-selftest мутирует два файла — rings/SR-00/QueenObserver.swift и сам Makefile — и восстанавливает их из копий. Ловушка на выходе (Makefile, строка ~29 внутри рецепта) делает так:
cp "$$backup" "$$victim"
vs=$$(shasum "$$victim" | cut -d" " -f1)
if [ "$$vs" != "$$victim_sha" ]; then echo "[FAIL] restore checksum mismatch"; fi
где victim_sha снята с того же файла перед копированием. Сравнение копии с оригиналом копии не может упасть — оно проверяет, что cp сработал, а не что файл никто не трогал.
Это ровно та дыра, что была в make mutants и закрыта коммитом b4d1946fe: там теперь пишется сумма мутированного состояния и сверяется перед восстановлением, а при расхождении цель отказывается затирать чужую запись и называет путь к копии.
Насколько это опасно
Меньше, чем в гарнитуре: та держала файл мутированным всё время прогона набора, около семидесяти секунд, и одна такая перезапись уже разошлась надвое (комментарий описывал код, которого в файле нет). check-selftest держит файл мутированным доли секунды между cp и cp. Но цель входит в check, а Makefile и QueenObserver.swift — файлы, которые агенты правят постоянно.
Что нужно
Тот же приём, что в b4d1946fe: записывать сумму после каждой мутации и сверять перед восстановлением; при расхождении — отказ с именем файла и путём к копии, мутацию не откатывать молча.
Мутационных мест в рецепте несколько, поэтому это не однострочная правка — отсюда отдельная задача, а не правка по ходу.
Найдено при аудите «каким событием в мире эту проверку можно уронить».
check-selftestмутирует два файла —rings/SR-00/QueenObserver.swiftи самMakefile— и восстанавливает их из копий. Ловушка на выходе (Makefile, строка ~29 внутри рецепта) делает так:где
victim_shaснята с того же файла перед копированием. Сравнение копии с оригиналом копии не может упасть — оно проверяет, чтоcpсработал, а не что файл никто не трогал.Это ровно та дыра, что была в
make mutantsи закрыта коммитом b4d1946fe: там теперь пишется сумма мутированного состояния и сверяется перед восстановлением, а при расхождении цель отказывается затирать чужую запись и называет путь к копии.Насколько это опасно
Меньше, чем в гарнитуре: та держала файл мутированным всё время прогона набора, около семидесяти секунд, и одна такая перезапись уже разошлась надвое (комментарий описывал код, которого в файле нет).
check-selftestдержит файл мутированным доли секунды междуcpиcp. Но цель входит вcheck, аMakefileиQueenObserver.swift— файлы, которые агенты правят постоянно.Что нужно
Тот же приём, что в b4d1946fe: записывать сумму после каждой мутации и сверять перед восстановлением; при расхождении — отказ с именем файла и путём к копии, мутацию не откатывать молча.
Мутационных мест в рецепте несколько, поэтому это не однострочная правка — отсюда отдельная задача, а не правка по ходу.