FlawOpen

flawopen.com/Direktori/226

● CWE-367 / CWE-829 · Tinggi
Riset Keamanan · FlawOpen

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.

💡 Penjelasan Sederhana (ELI5)

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

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-367 CWE-829

Alur Serangan Langkah demi Langkah

Langkah 1

Maintainer menyetujui rilis uji

Maintainer mengomentari pull request untuk memulai workflow rilis uji Marimo. Persetujuan semestinya terikat pada keadaan pull request yang telah ditinjau.

Langkah 2

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.

Langkah 3

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.

Langkah 4

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.

Langkah 5

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.

IMPLEMENTASI RENTAN
# 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.
PERBAIKAN AMAN & KUAT
# 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

Sumber