Marimo GHSL-2026-226: TOCTOU pada Workflow Rilis Uji
Balapan timestamp pada detik yang sama memungkinkan perubahan pull request melewati persetujuan rilis uji maintainer lalu mencapai job publikasi TestPyPI dan npm. Workflow rentan telah dihapus; CVE tidak ditetapkan.
Kepala laboratorium menyetujui sampel tertentu, tetapi laboratorium hanya memeriksa angka detik pada jam. Jika seseorang mengganti sampel pada detik yang sama, pengganti tampak disetujui. Workflow Marimo melakukan kesalahan serupa pada commit pull request, lalu mengirim paket hasil build ke job publikasi.
Konsep Kunci & Istilah
TOCTOU- Time-of-check to time-of-use: sumber daya berubah setelah pemeriksaan keamanan dan sebelum digunakan.
Publikasi OIDC- Job CI menukar identitas GitHub Actions dengan kredensial sementara untuk registry paket, tanpa menyimpan kata sandi jangka panjang.
Artefak workflow- Kumpulan berkas yang dikirim antarjob GitHub Actions. Job berikutnya harus memperlakukan artefak dari workflow tidak tepercaya sebagai input tidak tepercaya.
GHSL-2026-226- ID advisory GitHub Security Lab untuk kelemahan workflow Marimo ini. Advisory tidak menetapkan CVE.
CWE-367 / CWE-829- Advisory mengidentifikasi balapan pemeriksaan-penggunaan serta eksekusi fungsi dari ranah kendali yang tidak tepercaya.
Pemetaan kerangka kerja
Alur Serangan Langkah demi Langkah
Maintainer menyetujui rilis uji
Maintainer mengomentari pull request untuk memulai workflow rilis uji Marimo. Persetujuan semestinya terikat pada keadaan pull request yang telah ditinjau.
Head pull request berubah pada detik yang sama
Workflow membandingkan pushed_at repositori dan created_at komentar setelah mengubahnya menjadi detik bulat. Push pada detik yang sama menghasilkan nilai yang sama.
Pemeriksaan rentan menerima nilai sama
Workflow yang dihapus hanya menolak pushed_at yang secara ketat lebih lambat daripada waktu komentar. Nilai sama lolos dan commit terbaru dicatat.
Kode tidak tepercaya membangun artefak paket
Job melakukan checkout commit itu lalu menjalankan action dan skrip build yang dikendalikan repositori. Hasilnya diunggah sebagai artefak dan digunakan job publikasi lanjutan tanpa membangun ulang dari commit tepercaya.
Hak publikasi menjangkau keluaran tidak tepercaya
Job TestPyPI dan npm memakai izin publikasi OIDC. Advisory menyebut artefak dapat mencapai proses publikasi; tidak melaporkan kompromi paket sungguhan.
Kode Sumber: Rentan vs Aman
GHSL-2026-226 menyatakan workflow rentan dihapus melalui PR #10765; ini bukan klaim bahwa proyek menerapkan perubahan pembanding yang ditampilkan. Pemeriksaan lama memakai -gt sehingga timestamp detik bulat yang sama lolos. Kontrol ilustratif -ge menolak kesamaan, tetapi persetujuan sebaiknya diikat ke commit persis yang ditinjau. Pisahkan build tidak tepercaya dari job OIDC, bangun ulang dari SHA yang disetujui, dan verifikasi asal sebelum publikasi. Tidak ada payload eksploitasi.
# Workflow marimo-bot dihapus: perbandingan detik bulat
if [[ $(date -d "$pushed_at" +%s) -gt $(date -d "$COMMENT_AT" +%s) ]]; then
exit 1
fi
# head_sha hasil pemeriksaan di-checkout dan artefak
# dikirim ke job publikasi terpisah.
# Kontrol ilustratif; GHSL menyebut workflow rentan
# dihapus, bukan ditambal di tempat.
if [[ $(date -d "$pushed_at" +%s) -ge $(date -d "$COMMENT_AT" +%s) ]]; then
exit 1
fi
# Desain yang lebih kuat: setujui SHA tak berubah yang telah ditinjau,
# bangun ulang dari SHA itu di job tepercaya, lalu publikasikan keluaran terverifikasi.
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Hapus atau ganti salinan workflow marimo bot yang terdampak dan pastikan repositori saat ini tidak mengaktifkan jalur publikasi rentan.
- ✓Ikat persetujuan maintainer ke SHA pull request yang persis dan tidak berubah; gagalkan proses jika head berubah sebelum checkout.
- ✓Jangan gunakan timestamp detik bulat sebagai satu-satunya bukti bahwa cabang yang dapat berubah adalah versi yang disetujui.
- ✓Bangun pull request tidak tepercaya tanpa kredensial publikasi; batasi id-token: write pada job publikasi tepercaya yang terpisah.
- ✓Bangun ulang paket dari commit yang disetujui dalam alur tepercaya, jangan promosikan artefak yang dibuat kode tidak tepercaya.
- ✓Verifikasi provenance artefak, revisi sumber, isi paket, dan target sebelum publikasi ke TestPyPI atau npm.
- ✓Perlakukan advisory GHSL sebagai bukti jalur rentan, bukan bukti kompromi atau eksploitasi paket yang benar-benar terjadi.
Sumber
- Advisory GitHub Security Lab GHSL-2026-226 — reported by Jaroslav Lobačevski
- PR Marimo #10765 yang menghapus workflow rentan
- GitHub Security Lab: mencegah pwn request
- MITRE CWE-367: kondisi balapan time-of-check/time-of-use
- MITRE CWE-829: penyertaan fungsi dari ranah kendali yang tidak tepercaya
- Kasus workflow terkait tetapi terpisah: JupyterLab CVE-2026-84973