Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rustのunsound hole issue #25860を理解する

Rustのunsound hole issue #25860を理解する

Rustの有名なunsound holeの一つである https://github.com/rust-lang/rust/issues/25860 についてまとめたものです。ライフタイム境界の推論と反変性を悪用し、unsafeを使うことなく未定義動作を引き起こすことができます。

もうCTFで出題されても困りますけど、供養のため。

moratorium08

March 21, 2020
Tweet

More Decks by moratorium08

Other Decks in Programming

Transcript

  1. ライフタイム境界の推論 • ライフタイムの性質上、存在しえない型が存在する • 例: &ʼstatic &ʼa i32 • 参照の参照

    • ⼀段⽬の参照があるライフタイムa(≠static)なのに、それを指す参 照のライフタイムがstatic(aより⼤きい)にはなりえない • ⼀般に次のような関数のライフタイムを推論するとき • 「ライフタイムaはライフタイムbより⻑く⽣存する」と推論で きる
  2. 対処 • あんまりfnなんて使わないし(普通、Rustで関数の値を扱う場 合は、FnやFnMutといったトレイトを使う)、contravariance をなくしても誰も困らへんやろ • さすがに、「負け」の解決策では • 関数のシグネチャで推論をする割に、どういう推論をしたかが 外から⾒えないのが悪いので、明⽰的に「ʼaとʼbの関係にどう

    いう仮定を置いたか」を(内部的な)型として持てばいい • 実装がめんどいね〜 • ということで(多分)、今なおこのバグは健在 • RalfJungは、この状況に少し不満で、fake-staticという煽りト レイトを作っている 型システムのunsoundnessは存在そのものが悪なので はやく対処してほしいね〜
  3. 応⽤:シェルの奪取プログラム • メモリの破壊ができるということは、すなわち関数ポインタの 書き換えといった破壊活動を、unsafeを使うことなく可能 • CTFの問題として出題 • Google CTF 2019

    Quals ‒ sandstone • 制約がほぼ無い(もちろんunsafeが使えない、#なしなどの基本的制約あり) • CONFidence CTF 2020 Teaser - crusty sandbox/crsty sandbox • ⽂字数制約(350バイト)、no_std、traitなし(#はあり) • まあ上に被らずに出題するのは新しいバグでも発⾒されない限 り難しそうですが。 • 出題者が無知な場合、Rust問の⾮想定解として利⽤できるかもしれない