Let's Encrypt の証明書失効の原因は Go を使ったループ時の参照の扱いだったみたいですね
JavaScript でも var 時代にループ内で関数を作るとありがちだった問題です
const fns = []
for(var i = 0; i < 3; i++) {
fns.push(() => console.log(i))
}
fns[0]()
fns[1]()
fns[2]()
// 3
// 3
// 3
ニュースで見かけたときは何があったんだろうと思ってたらこんな基本的なミスが原因だったんですね
Go は詳しくないですが for の中で確保された i ってブロックスコープじゃないのでしょうか
i の参照を保持して out[0] でアクセスするときに解放された場所にアクセスしてそうに見えます
それでコンパイル時にエラー出れば防げそうなのに
この記事に対するコメントをみてみると Rust なら大丈夫だったみたいなのがありますし Rust だとこういうところも安全のようですね
そもそも Let's Encrypt って Go で動いてたんだ