Изследвания / S18
Какво защитават неизменяемите издания в работните процеси на GitHub Actions
Какво защитават неизменяемите издания на GitHub в работните процеси (workflows) на GitHub Actions в популярни хранилища?
Резюме
От 2025-10-28 издание (release) в GitHub може да бъде публикувано като неизменяемо (immutable): неговият таг (tag) в Git вече не може да бъде преместен или изтрит. Документацията на GitHub също така казва на авторите на действия (actions), че таг, който искат да продължат да обновяват, например тагът на основната версия v1, не трябва да бъде обвързван с издание, и им предлага да „препоръчат на потребителите си да посочват основна версия“. Работен процес (workflow), в който е записано uses: owner/action@v1, следва тази документирана, предвидена употреба и неизменяемите издания не го защитават. Измерихме какво защитава механизмът на практика, на 2026-10-03, единствено чрез API на GitHub:
- A: 1 000-те хранилища с най-много звезди сред публичните хранилища, които не са форкове, не са архивирани и в които е имало push през последните 90 дни (праг 29 565 звезди);
- B: 500 хранилища, избрани на случаен принцип (начална стойност (seed) 20261003) от 20 553-те такива хранилища с 1 000–5 000 звезди.
Работните процеси в клона им по подразбиране съдържат 58 690 отдалечени препратки uses: в A и 10 472 в B. Всяка от тях е класифицирана като фиксирана (pinned) чрез SHA на commit, чрез таг на неизменяемо издание, чрез изменяем таг или чрез клон.
Там, където авторът вече публикува неизменяеми издания, почти никоя препратка не е защитена. От препратките към тагове на действия, чието най-ново издание е неизменяемо, 312 от 6 898 (4,5%) сочат към защитен таг в A (95% интервал 2,8–7,1%, bootstrap по хранилища), а 76 от 1 564 (4,9%) в B. Защитените са концентрирани: едно хранилище съдържа 68 от 312-те, а изключването на което и да е отделно хранилище дава 3,6–4,6%. Почти всички останали са тагове на основната версия като @v7. За 3 238 от 6 586 (49,2%) от незащитените препратки в A (интервал 43,2–56,0%) таг на неизменяемо издание вече сочи към същия commit, така че преминаването към него не би променило кода, който се изпълнява.
Най-използвани действия. 28 от 50 (56,0%) от хранилищата на действия, използвани от най-много хранилища в A, публикуват най-новото си издание като неизменяемо. Собствени действия на GitHub (first party): 12 от 28 (42,9%) за actions/* (да: setup-node, setup-python, setup-go, setup-java; не: checkout, cache, upload-artifact, download-artifact, github-script) и 3 от 6 (50,0%) за github/*.
Защитата идва от фиксирането чрез SHA, и то при малцинство от хранилищата. Общо 32 978 от 58 690 (56,2%) отдалечени препратки в A са фиксирани чрез SHA (интервал 50,7–61,7%), а в B – 4 812 от 10 472 (46,0%) (интервал 29,0–60,1%; 37,7% без най-голямото му хранилище, open-telemetry/opentelemetry-python, което съдържа 1 392 препратки). Типичното хранилище фиксира малко: медианният дял на SHA по хранилище е 5,0% в A и 0,0% в B. Всяка отдалечена препратка, записана във файловете на работните процеси, е фиксирана чрез SHA в най-много 263 от 891 (29,5%) хранилища в A и в 174 от 891 (19,5%), ако се изключат 89-те, които извикват и локални действия, които не прочетохме; в B – в най-много 65 от 398 (16,3%), съответно в 55 от 398 (13,8%). Неизменяеми тагове: 0,6% от препратките в A, 0,8% в B.
Заключването на зависимости на ниво работен процес (workflow-level dependency locking), обявено на 2026-03-26 с „Public preview 3-6 months“, не беше пуснато към 2026-10-03: елементите му в пътната карта (roadmap) са отворени и нито запис в changelog, нито справочникът за синтаксиса на работните процеси го документират. Тези данни описват състоянието преди пускането му.
Предишни изследвания. datosh/pinned-actions проследява фиксирането чрез SHA в 10 000-те хранилища с най-много звезди („само 7%“ фиксират изцяло, април 2026 г.; 506 от 6 290 хранилища, използващи Actions, 8,0%, в архива му) и през април 2026 г. добави проверка за неизменяемост на най-новото издание; joshjohanning/ensure-immutable-actions (от 2025-11) проверява дали препратките в работните процеси използват неизменяеми издания. Статии измериха фиксиране чрез SHA при 1–2% от препратките през 2022 г.; NDSS 2026 установи, че 16,2% от хранилищата посочват всяко действие на трета страна чрез SHA или чрез таг на потвърден създател (verified creator). Нашите 29,5% се различават от 8,0% при datosh главно поради съвкупността (първите 1 000 със скорошна активност, а не първите 10 000) и датата; първите 1 000 записа на самия datosh дават 100 от 781 (12,8%). Доколкото успяхме да установим, H1 (колко препратки към тагове защитават неизменяемите издания) и 49,2%-те с неизменяем таг на същия commit не са били измервани. Статия и източници: https://easybyte.es/lab/studies/s18/paper/.
Автоматизация и преглед. Изследването е проведено от агенти с ИИ, които са написали и текста. Работата е проверена от независим рецензент с ИИ; констатациите му са приложени (METHOD.md, раздел Deviations).
Конфликт на интереси. EasyByte разработва attest-lint и може да пусне scripts/uses_check.py, използвания тук класификатор, като безплатен инструмент. За разлика от ensure-immutable-actions, който предлага фиксиране чрез SHA, той посочва за всеки подвижен таг тага на неизменяемо издание на същия commit.
Цитирайте това изследване
EasyxLab (2026). What immutable releases protect in GitHub Actions workflows. Study S18. EasyByte Hub S. Coop. Mad. https://github.com/easybytehub/easyxlab/tree/main/studies/s18-actions-immutable-releases@techreport{easyxlab_s18,
title = {What immutable releases protect in GitHub Actions workflows},
author = {{EasyxLab}},
institution = {EasyByte Hub S. Coop. Mad.},
number = {S18},
year = {2026},
url = {https://github.com/easybytehub/easyxlab/tree/main/studies/s18-actions-immutable-releases}
}