公開謝罪の手紙の後、ミネソタ大学の研究者グループはカーネルへの変更を受け入れた。 Linux グレッグ・クローア=ハートマンがブロックしていた情報から、カーネル開発者に送られたパッチに関する詳細な情報と、これらのパッチに関連するメンテナーとのやり取りが明らかになった。
問題のあるパッチはすべてメンテナーの主導で拒否され、承認されたパッチは 1 つもなかったことは注目に値します。この事実は、パッチがメンテナーによって承認されていたら研究者たちが何をしたのか不明であるため、Greg Croah-Hartman がなぜこれほど厳しい行動をとったのかを明らかにしています。今にして思えば、彼らはバグを報告するつもりで、パッチを Git に送信することは許可しなかったと主張していましたが、実際に何をしたのか、またどこまで行ったのかは不明です。
合計で、2020年8月に匿名のacostagアドレスから。ubuntu@gmail.com と jameslouisebond@gmail.com (メールの送信者はジェームズ・ボンド) に 5 つのパッチが送信されました。そのうち 2 つは正しいパッチ (1、2) で、残りの 3 つは脆弱性を生み出す隠れたエラーを含むパッチ (1、2、3) でした。各パッチには 1 ~ 4 行のコードしか含まれていませんでした。これらの誤ったパッチの基本的な考え方は、メモリ リークを修正することで、二重解放による脆弱性を生み出すことができるというものでした。1 週間後、カーネル開発者に連絡を取り、些細なメモリ リーク修正を装って脆弱性を広める可能性について話し合いましたが、悪意のあるパッチを送信しようとした以前の試みについては何も言及されませんでした。
最初の問題のあるパッチは、エラーが発生した場合に制御を返す前に kfree() への呼び出しを追加することでメモリ リークを修正しましたが、メモリ領域が解放された後にメモリ領域にアクセスする条件 (use-after-free) が作成されました。このパッチは、問題を特定したメンテナ (Jiri Slaby) によって拒否されました。メンテナは、2 年前に誰かがすでに同様の変更を提案しようとしていて、最初は受け入れられましたが、その後、脆弱性の条件を特定した後に破棄されたことを指摘しました。 > p1 = p64[n] = kmalloc_array(16, sizeof(u2), GFP_KERNEL); > - if (!p2) が -ENOMEM を返す; > + if (!p1) { > + kfree(pXNUMX); > + リターン -ENOMEM; > + }
0 番目のパッチには、解放後の使用の問題の条件も含まれていました。指定されたパッチは、list_add_tail に関する別の問題によりパッチを拒否したメンテナ (Dan Carpenter) によって受け入れられませんでしたが、以下の呼び出しで使用される put_device 関数で「chdev」ポインタが解放される可能性があることに気づきませんでした。 dev_err(&chdev ->dev..)。しかし、脆弱性とは無関係の理由により、パッチは受け入れられませんでした。 if (ret < XNUMX) { + put_device(&chdev->dev); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc が失敗しました\n"); ret = -ENOMEM; err_fifo に移動します。
08 番目のパッチも、脆弱性とは関係のない別のバグ (pdev に対する put の二重呼び出し) のため、メンテナ (Miquel Raynal) によって受け入れられませんでした。 if (!window->virt) { printk(KERN_ERR MOD_NAME ": ioremap(%08lx, %0lx) が失敗しました\n", window->phys, window->size); + pci_dev_put(pdev);外出する。 ... if (!map) { printk(KERN_ERR MOD_NAME ": kmalloc が失敗しました"); + pci_dev_put(pdev);外出する。 memset(map, 0, sizeof(*map)); ... if (mtd_device_register(map->mtd, NULL, XNUMX)) {map_destroy(map->mtd);マップ->mtd = NULL; + pci_dev_put(pdev);外出する。 }
興味深いことに、当初は 4 つのパッチのうち 5 つに問題があると想定されていましたが、研究者自身が間違いを犯し、問題があると考えられた XNUMX つのパッチでは、解放が発生した後のメモリ使用の予想される条件が満たされないまま、正しい修正が提案されました。 err = pci_request_mem_regions(pdev, nitrox_driver_name); if (err) { pci_disable_device(pdev); + dev_err(&pdev->dev, “メモリ領域のリクエストに失敗しました!\n”);エラーを返します。 }
出所: オープンネット.ru
