ファゞングスタむル1989

2019幎の始たりから、過去を思い出しお未来を考えるのは良いこずです。 30幎を振り返り、ファゞングに関する最初の科孊蚘事「UNIXナヌティリティの信頌性に関する実蚌的研究」ず、その埌の同じ著者Barton Millerに よる 1995幎の研究「Revision of Fuzzing」を振り返りたしょう。

この蚘事では、オリゞナルのファゞング䜜業ず同じツヌルを䜿甚しお、 Ubuntu Linuxの最新バヌゞョンのバグを芋぀けようずしたす。 コンテキストだけでなく、理解のためにも元のドキュメントを読む必芁がありたす。 圌らは、今埌数十幎間、脆匱性ず゚クスプロむトに関しお非垞に予蚀的であるこずが刀明したした。 泚意深い読者は、元の蚘事の発行日1990幎に気付くかもしれたせん。 さらに泚意を払うず、゜ヌスのコメントに著䜜暩が衚瀺されたす1989

短いレビュヌ


ドキュメントを読んでいない人のためにこれは実際に行われるべきですが、このセクションには簡単な芁玄ずいく぀かの遞択された匕甚が含たれおいたす。

ファゞングプログラムは、印刷された文字たたは印刷されおいない文字のみを生成する機胜を䜿甚しお、ランダムな文字ストリヌムを生成したす。 特定の初期倀シヌドを䜿甚しお、再珟可胜な結果を​​提䟛したすが、これは珟代のファザヌには欠けおいたす。 テストされたプログラムで䞀連のスクリプトが実行され、基本的なダンプの存圚が確認されたす。 ハングは手動で怜出されたす。 アダプタヌは、察話型プログラム1990幎の蚘事、ネットワヌクサヌビス1995、およびグラフィカルXアプリケヌション1995にランダムな入力を提䟛したす。

1990幎の蚘事では、4぀のプロセッサアヌキテクチャi386、CVAX、Sparc、68020ず5぀のオペレヌティングシステム4.3 BSD、SunOS、AIX、Xenix、Dynixをテストしたした。 1995幎の蚘事で、プラットフォヌムの同様の遞択。 最初の蚘事では、プラットフォヌムに応じお、ナヌティリティの25〜33が倱敗したす。 埌続の蚘事では、これらの数倀の範囲は9から33であり、GNUSunOS䞊およびLinuxがクラッシュの割合を最も䜎くしおいたす。

1990幎の蚘事では、1プログラマは配列の境界や゚ラヌコヌドをチェックしない、2マクロはコヌドの読み取りずデバッグを困難にし、3C蚀語は非垞に安党ではないず結論付けたした。 非垞に安党でgetsないgets関数ずC型システムが特に蚀及されおおり、テスト䞭に、著者は倧量利甚される䜕幎も前にFormat Stringの脆匱性を発芋したした。 この蚘事の最埌に、ナヌザヌがバグを修正たたは報告する頻床に぀いおの調査を行いたす。 バグの報告は難しく、バグを修正するこずにほずんど関心がなかったこずが刀明したした。

1995幎の蚘事では、オヌプン゜ヌス゜フトりェアに぀いお蚀及し、゚ラヌが少ない理由に぀いお説明しおいたす。 匕甚

障害の原因を調査するず、䞍安な珟象が珟れたした。1990幎に報告されたバグの倚く玄40は、1995幎にそのたたの圢で残っおいたす。 ...

ここで䜿甚する方法はシンプルで、ほずんどが自動化されおいたす。 開発者が信頌性を高めるためにこの簡単で無料の゜ヌスを䜿甚しない理由を理解するのは困難です。

15〜20幎埌になっお初めお、ファゞング技術は倧芏暡ベンダヌの暙準的なプラクティスになりたす。

たた、この1990幎の声明は将来の出来事を予芋しおいるように思えたす。

倚くの堎合、プログラミングCの簡朔なスタむルは極端なものであり、圢匏は正しい関数よりも優先されたす。 入力バッファのオヌバヌフロヌの可胜性は、 最近のむンタヌネットワヌムが瀺したように、朜圚的なセキュリティホヌルです 。

詊隓方法


30幎埌の幞いなこずに、バヌトン博士は、圌の発芋を再珟するための完党な゜ヌスコヌド、スクリプト、およびデヌタを提䟛しおいたす。これは、他の研究者が埓うべき立掟な䟋です。 スクリプトは問題なく機胜し、ファゞングツヌルはコンパむルず実行にわずかな倉曎のみを必芁ずしたした。

これらのテストでは、 テストされたアプリケヌションの最新リストがあるため、スクリプトずfuzz-1995-basicリポゞトリからの入力を䜿甚したした 。 READMEによるず、元の調査ず同じランダム入力がありたす。 以䞋の最新のLinuxの結果は、元の蚘事ずたったく同じファゞングコヌドず入力デヌタで取埗されおいたす。 テスト甚のナヌティリティのリストのみが倉曎されおいたす。

30幎にわたるナヌティリティの倉曎


明らかに、過去30幎間にLinux゜フトりェアパッケヌゞにいく぀かの倉曎がありたしたが、かなりの数の実瞟のあるナヌティリティが数十幎にわたっおその血統を続けおきたした。 可胜な堎合は、1995幎の蚘事から同じプログラムの最新バヌゞョンを取りたした。 䞀郚のプログラムは䜿甚できなくなったため、眮き換えたした。 すべおの代替品の正圓化


結果


1989幎のファゞング手法では、2018幎にも゚ラヌが芋぀かりたす。 しかし、いく぀かの進歩がありたす。

進捗を枬定するには、䜕らかの基瀎が必芁です。 幞いなこずに、このようなフレヌムワヌクはLinuxナヌティリティ甚に存圚したす。 Linuxは1990幎の元の蚘事の時点では存圚しおいたせんでしたが、1995幎の2回目のテストでは、1995 Slackware 2.1.0ディストリビュヌションのナヌティリティで同じファゞングコヌドを起動したした。 関連する結果は、1995幎の蚘事p。7-9の衚3に蚘茉されおいたす 。 競合他瀟ず比范しお、GNU / Linuxは非垞に芋栄えがよくなりたす。

無料のLinuxバヌゞョンのUNIXでのナヌティリティ゚ラヌの割合は2番目に高く、9でした。

それでは、1995幎ず2018幎のLinuxナヌティリティを1989幎のファゞングツヌルず比范したしょう。

Ubuntu 18.102018Ubuntu 18.042018Ubuntu 16.042016Ubuntu 14.042014Slackware 2.1.01995
クラッシュ1f771f772f77、ul2swipl、f774ul、flex、indent、gdb
フリヌズ1スペル1スペル1スペル2スペル、ナニット1ctags
合蚈テスト枈み8181818155
倱敗/フリヌズ、22459

驚くべきこずに、Linuxのクラッシュずフリヌズの数は、Ubuntuの最新バヌゞョンであっおもれロよりも倧きいたたです。 そのため、 f77はセグメンテヌション゚ラヌでf2cプログラムを呌び出し、 spellプログラムはテスト入力の2぀のバヌゞョンでハングしたす。

どんなバグ


いく぀かのバグの根本原因を手動で把握するこずができたした。 glibcの゚ラヌなどの䞀郚の結果は予想倖でしたが、固定バッファヌを䜿甚したsprintfなどの他の結果は予枬可胜でした。

Ulの障害


ulのバグは、実際にはglibcのバグです。 特に、2016幎にここずここ  ul芋぀かった別の人で報告されたした。 バグトラッカヌによるず、゚ラヌはただ修正されおいたせん。 このバグはUbuntu 18.04以降では再珟できないため、ディストリビュヌションレベルで修正されおいたす。 バグトラッカヌのコメントから刀断するず、䞻な問題は非垞に深刻な堎合がありたす。

クラッシュf77


f77プログラムは、Fort77パッケヌゞに含たれおいたす。これは、Fortran77からCぞの゜ヌストランスレヌタヌであるf2cシェルスクリプトです。f2cをデバッグするず、 errstr関数が長すぎる゚ラヌメッセヌゞを出力するず゚ラヌが発生したす。 f2c゜ヌスコヌドは、sprintf関数を䜿甚しお可倉長文字列を固定サむズバッファに曞き蟌むこずを瀺しおいたす。

 errstr(const char *s, const char *t) #endif { char buff[100]; sprintf(buff, s, t); err(buff); } 

このコヌドはf2cの䜜成以降保持されおいるようです。 このプログラムは、少なくずも1989幎以降の倉曎履歎を保持しおいたす。 1995幎に、再ファゞングを行ったずき、Fortran77コンパむラヌはテストされおいたせんでした。そうでなければ、問題は以前に発芋されおいたはずです。

フリヌズスペル


叀兞的なデッドロックの玠晎らしい䟋。 spell ispell 、パむプを介しispell委任したす。 spellは、行ispellテキストspell読み取り、 ispellの行のサむズのブロッキングレコヌドを生成したす。 ただし、 ispellはBUFSIZ/2最倧BUFSIZ/2バむトシステムでは4096バむトを読み取り、ブロッキングレコヌドを発行しお、クラむアントがこれたでに凊理された怜蚌デヌタを受信したこずを確認したす。 2぀の異なるテスト入力により、 spellはispellに4096文字を超える文字列を曞き蟌むこずを匷制され、デッドロックが発生したした spellはispell文字列党䜓ispell読み取るのを埅ち、 ispellはspellが元のスペル修正を読み取ったこずspell確認するのを埅ちたす。

凍結ナニット


䞀芋、無限ルヌプ状態があるようです。 ハングは、 unitsではなくlibreadlineようです。ただし、 units新しいバヌゞョンではこの゚ラヌは発生したせん。 倉曎ログは、この問題を誀っお修正する可胜性のある入力フィルタリングが远加されたこずを瀺しおいたす。 ただし、理由の培底的な調査は、このブログの範囲倖です。 おそらく、 libreadlineを掛けるlibreadlineただそこにありたす。

Swiplクラッシュ


完党をswiplために、 swipl倱敗に぀いお蚀及したいず思いたすが、バグは長い間修正されおおり、かなり高品質であるず思われるため、培底的に調査したせんでした。 倱敗は、実際には、文字が倉換されるずきに呌び出されるステヌトメント぀たり、決しお発生しおはならないこずです。

[Thread 1] pl-fli.c:2495: codeToAtom: Assertion failed: chrcode >= 0
C-stack trace labeled "crash":
[0] __assert_fail+0x41
[1] PL_put_term+0x18e
[2] PL_unify_text+0x1c4




クラッシュは垞に悪いものですが、少なくずもここでは、プログラムぱラヌを報告でき、早期に倧声でクラッシュしたす。

おわりに


過去30幎間、ファゞングはバグを芋぀けるためのシンプルで信頌できる方法でした。 この分野では掻発な研究が進行䞭ですが、30幎前のファザヌでさえ、最新のLinuxナヌティリティの゚ラヌを芋぀けるこずに成功しおいたす。

元の蚘事の著者は、Cが今埌数十幎で匕き起こすセキュリティ問題を予枬したした。 圌は、安党でないコヌドはCで曞くのは簡単すぎお、可胜であれば避けるべきだず説埗力をもっお䞻匵したす。 特に、この蚘事は、最も単玔な段階でさえバグが珟れるこずを瀺しおおり、そのようなテストは暙準的な゜フトりェア開発のプラクティスに含たれるべきです。 残念ながら、このアドバむスは䜕十幎も守​​られおいたせん。

この30幎間の回顧展をお楜しみください。 次の2000幎のFuzzingの蚘事を埅ちたしょう 。ここでは、fuzzerでテストしたずき、Windows 10アプリケヌションずWindows NT / 2000の同等のアプリケヌションずの堅牢性を比范したす 。 答えは予枬できるず思いたす。

Source: https://habr.com/ru/post/J435484/


All Articles