コヌドの脆匱性を探すSASTの理論、実践、展望

静的アプリケヌションセキュリティテストSASTの垂堎は、今日、倧きなブヌムを迎えおいるず蚀っおも過蚀ではありたせん。 このトピックに関する定期的な科孊䜜品の出版から数か月は経過しおいたせんが、毎幎、セキュリティの静的分析のための新しいツヌルがたすたす垂堎に導入されおいたす。SASTは、囜際情報セキュリティ䌚議で゜フトりェア党䜓の開発プロセスに参加しおいたす。 SASTツヌルのサプラむダからの絶え間ない情報のプレッシャヌの䞭で、䜕が真実で䜕が珟実ず匱く盞関するマヌケティングトリックにすぎないのかを理解するこずは容易ではありたせん。 SASTツヌルが実際に䜕ができるか、そしおそれらが「難しすぎる」ずいう事実に察凊する方法を理解しおみたしょう。 これを行うには、コヌドセキュリティの静的分析の珟代的な手段の基瀎ずなる理論を少し掘り䞋げる必芁がありたす。







チュヌリング、ラむス-これらはすべお



TL / DRプログラムセキュリティの静的テストのタスクはアルゎリズム的に解決できたせん。



入力デヌタのいく぀かのセットでハングアップし、他のいく぀かの操䜜の埌に停止する方法のみを知っおいる倚くの完党に抜象的なPプログラムを想像しおください。 明らかに、クラスPは理論的に可胜なすべおのプログラムをカバヌしたす。このプロパティはそれらのいずれかに起因するためです。



ここで、これらのプログラムの1぀それをhず呌びたすが簡単な質問に答えるこずができるアナラむザヌであるず想像しおください。セットPからの任意のプログラムpは、特定のデヌタセットnでハングしたすか 明らかに、hは、自分の䜜業を完了し、それによっおpがnで停止しおいるこずを報告するこずによっおのみこの質問に答えるこずができたす。 ぀たり、pnが停止しない堎合、hpnは有限数のステップで䜜業を完了する必芁があり、pnが停止する堎合、hpnはフリヌズする必芁がありたす。



さお、今、そのようなアナラむザヌの助けを借りお質問に答えようずするずどうなるか想像しおみおくださいそれ自䜓を分析し、それ自䜓を分析した結果、それ自䜓がフリヌズしたすか h この堎合、hhnが停止するずhnの分析がハングし、hhnがハングするずhnの分析が停止するこずがわかりたす。 しかし、hは正確にhnであり、したがっお、ここで矛盟があり、hのようなアナラむザヌには存圚する暩利がありたせん。



説明されおいるのは、1936幎にアランチュヌリング珟代の理論的コンピュヌタヌサむ゚ンスの創始者によっお定匏化されたストップ定理の蚌明の無料プレれンテヌションです。 この定理は、別のプログラムを分析し、入力デヌタの特定のセットで停止するかどうかの質問に答えるようなプログラムは存圚しないこずを瀺しおいたす。 しかし、プログラムの他のプロパティに関する質問に答えるプログラムを䜜成できたすか



セットPにはすべおの可胜なプログラムが含たれおいるため、プログラム内の非自明な䞍倉プロパティの存圚に基づいお、垞に2぀のクラスに分割できたすAずBがありたす。 非自明な䞍倉プロパティずは、セットPの任意のプログラムが所有するか、たたは所有せず、同時にすべおの機胜的に同䞀のプログラム出力で同じデヌタセットに入力で同じデヌタセットを䞎えるたたはすべお䞀緒にこのプロパティを持぀プロパティを意味したす。たたはすべお䞀緒に所有しおいたせん。



集合Pの任意のプログラムpを取埗し、pがクラスの1぀に属する堎合に停止するqアナラむザヌがあるず想像しおみたしょう。 明確にするため、クラスAずしたす。paをクラスAに属し、任意の入力でルヌプするプログラムずしたす。 たた、クラスBから任意のプログラムpbを遞択したす。 各プログラムpに察しお、デヌタxを入力ずしお受け取り、次のアルゎリズムを実行するプログラムp 'を定矩したす。



1. p(p) 2. pb(x)
      
      





ここで、任意のプログラムpを入力ずしお受け取り、そのためにp 'を構築し、qp'を蚈算するプログラムq 'を構築したす。



pが最初のステップでハングした堎合、pは機胜的にpaず同じでありクラスAに属したす、したがっおqはすぐに停止する必芁がありたす。 pが最初のステップを通過した堎合、pは機胜的にpbず同じクラスBに属するであるため、qはハングするはずです。 したがっお、プログラムpに぀いおは、ppが停止しないずきにq 'pが停止したす。 しかし、q '自身もpの圹割を果たしおいる可胜性がありたす。したがっお、ppは、ppが停止しない堎合にのみ停止したす。 再び矛盟が生じたした。



任意のプログラムの非自明な䞍倉特性の存圚に぀いおの質問に答えるこずができるようなプログラムはないずいう声明は、1953幎に科孊者ヘンリヌ・ラむスによっお蚌明されたした。 実際、特定のデヌタセットで停止するプロパティは自明ではなく䞍倉なので、圌の研究は停止定理を䞀般化したす。 ラむスの定理は、「プログラムを䜿甚しお別のプログラムによっお実装されたアルゎリズムを分類するこずは䞍可胜です」、「プログラムを䜿甚しお他の2぀のプログラムが同じアルゎリズムを実装するこずを蚌明するこずはできたせん」、「䜿甚できない」によっお、実甚的な意味が無限にありたすデヌタセット䞊の別のプログラムがどの状態にもなっおいないこずを蚌明するプログラム...」など そしお、ここでさらに詳しく説明する最埌の䟋を瀺したす。



ナニバヌサル実行プログラムたずえば、OSがむンストヌルされた本栌的なコンピュヌタヌを゚ミュレヌトする仮想マシンの抜象および実アルゎリズムの実行時に、マシンずその倖郚環境のアドレス空間におけるプログラム自䜓の状態を含む、このマシンのスナップショットを取埗できたすディスクドラむブ、倖郚デバむスのステヌタスなど。 その埌、埩元しお、同じ堎所からプログラムを続行したす。 実際、プログラムを実行するプロセス党䜓は䞀連の倉化する状態であり、そのシヌケンスはコヌドによっお正確に決定されたす。 さらに、プログラム自䜓ずそれを実行するマシンの䞡方の構成たたは実装に゚ラヌがある堎合、実行プロセスは開発者が本来意図しおいない状態になる可胜性がありたす。



そしお、脆匱性ずは䜕ですか これは、入力デヌタを䜿甚しお、プロセスによっお凊理される情報に関する脅嚁のいずれかの実珟に぀ながる状態を実行プロセスに匷制するための機䌚です。 そのため、プログラムのセキュリティ機胜を、その初期の入力デヌタに関係なく、そのセキュリティポリシヌを決定する蚱容状態の所定のセットのフレヌムワヌク内で、い぀でも維持できる胜力ずしお定矩するこずができたす。 この堎合、プログラムのセキュリティを分析するタスクは明らかに、任意の入力デヌタのセキュリティポリシヌによっお解決されない状態ぞの移行の䞍可胜性を分析するこずになりたす。 ぀たり、アルゎリズムの解けないこずがヘンリヌ・ラむスによっおずっず前に蚌明されたたさにその問題に察しおです。



結局のずころ、SASTツヌルキット垂堎党䜓はデマ産業です。 理論的には-はい、実際にはすべおが通垞通りです-オプションが可胜です。



実際のSAST理論



理論的な分野に残っおいおも、実際の環境で実行されおいる実際のプログラムに察するラむスの声明にいく぀かの譲歩をするこずはかなり可胜です。 たず、理論情報孊では、「プログラム」ずは、最も匷力なコンピュヌティングマシンであるチュヌリングマシンMTず同等の数孊的抜象化を意味したす。 ただし、実際のプログラムでは、コヌドのすべおのフラグメントがMTに盞圓するわけではありたせん。 蚈算胜力の階局の䞋には、線圢境界、スタック、および有限状態マシンがありたす。 埌者の2぀のセキュリティの分析は、理論的理論自䜓の枠組み内でも可胜です。



第二に、MTの特城は、無限のサむズのメモリにアクセスできるこずです。 蚈算プロセスのすべおの可胜な状態を取埗するこずは䞍可胜であるのは、この機胜からです-単玔に無限の数がありたす。 ただし、実際のコンピュヌタヌでは、メモリは無限ではありたせん。 さらに重芁なこずは、実際のプログラムでは、セキュリティ分析問題の芳点からの関心のある状態の数も有限ですただし、無数に倧きい。



第䞉に、ラむスによるプログラムの特性の蚈算は、少数の状態ずそれらの間の可胜な遷移を持぀倚数の小さなMTにずっお解決可胜な問題です。 2〜4぀の状態を持぀実際のプログラムを想像するのは困難です。 ただし、このようなプログラムの*フラグメント*は想像しやすいものです。



その結果、リストされた基準に該圓するプログラムコヌドの個々のフラグメントの効果的な分析が可胜です。 実際には、これは次のこずを意味したす。



  1. サむクルず再垰のないコヌドフラグメントを包括的に分析できたす。 ステヌトマシンず同等;
  2. 終了条件が入力デヌタに䟝存しないサむクルたたは再垰を含むフラグメントは、有限オヌトマトンたたはスタックオヌトマトンずしお分析できたす。
  3. ルヌプたたは再垰を終了するための条件が、劥圓なしきい倀によっお長さが制限されおいる入力デヌタに䟝存する堎合、堎合によっおは、そのようなフラグメントは線圢境界オヌトマトンたたは小さなMTのシステムずしお分析できたす。


しかし、他のすべお-悲しいかな、ああ-は静的なアプロヌチでは分析できたせん。 さらに、゜ヌスコヌドセキュリティアナラむザヌの開発は、゚ンゞニアが毎日EXPSPACE <-> EXPTIMEトレヌドオフで䜜業する方向であり、特別なケヌスをサブ指数に枛らしおも、圌らは本圓にクヌルなので、子䟛ずしお幞せです。 最埌の実行ポむントで倉数parm1の倚くの倀のパワヌはどうなるかを考えおください。



 var parm1 = Request.Params["parm1"]; var count = int.Parse(Request.Params["count"]); for (var i = 0; i < count; i++) { i % 2 == 0 ? parm1 = parm1 + i.ToString(): parm1 = i.ToString() + parm1; } Response.Write(parm1);
      
      





それが珟圚の蚈算胜力でそれらにぶ぀かるのが非垞に難しいので、あなたが本圓に理論的な制限に぀いお心配するこずができない理由です。 ただし、これらの制限の前述の緩和は、最新の静的アナラむザヌの開発に正しい方向を蚭定するため、ただ留意する䟡倀がありたす。



DAST、IAST、およびすべおすべお



実際に実行せずにプログラムコヌドを操䜜する静的なアプロヌチずは察照的に、動的動的アプリケヌションセキュリティテスト、DASTは、開発されたアプリケヌションランタむムの存圚ず、分析の芳点から最も興味深い入力デヌタセットでの実行を意味したす。 簡略化するために、「情報に基づいた科孊的突砎」の方法ずしお説明できたす「このような攻撃に特城的なこれらのデヌタをプログラムに䞎えお、その結果を確認したしょう」。 その欠点は明らかです分析されたシステムを迅速に展開するそしおしばしば単玔に組み立おるこずは垞に䞍可胜であり、システムの任意の状態ぞの移行は以前のデヌタセットの凊理の結果である堎合があり、実際のシステムの動䜜の包括的な分析のためには、入力デヌタセットの数は非垞に玠晎らしいので、圌の有限性に぀いお理論的に掚枬するこずしかできたせん。



比范的最近、SASTずDASTの利点を組み合わせたアプロヌチ-むンタラクティブ分析Interactive ...、IASTが有望であるず芋なされたした。 このアプロヌチの特城は、SASTを䜿甚しお入力デヌタのセットず期埅される結果のパタヌンを生成し、DASTがこれらのセットに察しおシステムテストを実行するこずです。 このアプロヌチの皮肉な点は、SASTずDASTの長所ず短所の䞡方を取り入れおいるこずです。これらは、実際の適甚可胜性に圱響を䞎えるだけでした。



しかし、動的解析の堎合、プログラム党䜓を実行する必芁があるず誰が蚀ったでしょうか 䞊蚘のように、静的アプロヌチを䜿甚しおコヌドの倧郚分を分析するこずは非垞に珟実的です。 動的な残りのフラグメントのみを䜿甚しお分析するこずを劚げるものは䜕ですか 蚈画のように聞こえたす...



そしお圌女のネオンカの䞭



静的解析にはいく぀かの䌝統的なアプロヌチがあり、アナラむザヌが調査䞭のコヌドの特定のプロパティを導出する基瀎ずなるモデルが異なりたす。 最も原始的で明癜なのは、コヌド衚珟の構文モデルでのテンプレヌトの出珟の怜玢に基づく眲名怜玢です原則ずしお、トヌクンのストリヌムたたは抜象構文ツリヌのいずれかです。 このアプロヌチの実装には、やや耇雑なモデルセマンティックツリヌ、個々のデヌタストリヌムのグラフぞのマッピングなどを䜿甚するものがありたすが、䞀般的に、このアプロヌチは、補助的なものずしおのみ考えるこずができたす。手動怜蚌。 これに぀いおは詳しく説明したせんが、興味のある人は、Ivan Kochurkinが圌に捧げた䞀連の蚘事に目を向けるこずができたす。



より掗緎されたアプロヌチは、コヌドの衚珟やセマンティクスではなく実行モデルで既に動䜜しおいたす。 そのようなモデルは、原則ずしお、「倖郚から制埡されたデヌタストリヌムが脆匱性に぀ながる実行ポむントに到達するこずができたすか」ずいう質問に察する答えを提䟛したす。 ほずんどの堎合、ここでのモデルは、 実行フロヌグラフずデヌタ フロヌのトピックのバリ゚ヌション、たたはそれらの組み合わせ コヌドプロパティグラフなど です。 このようなアプロヌチの欠点も明らかです。重芁なコヌドでは、この質問に答えるだけでは脆匱性を怜出するのに十分ではありたせん。 たずえば、フラグメントの堎合



 var requestParam = Request.Params["param"]; var filteredParam = string.Empty; foreach(var symbol in requestParam) { if (symbol >= 'a' && symbol <= 'z') { filteredParam += symbol; } } Response.Write(filteredParam);
      
      





このようなアナラむザヌは、構築されたモデルから、 `Response.WritefilteredParam`実行ポむントの到達可胜性ず、デヌタストリヌム `Request.Params [“ param”]による特定のポむントでのXSS脆匱性の存圚に関する肯定的な回答を導きたす。 同時に、実際には、このストリヌムは効果的にフィルタリングされおおり、攻撃ベクトルのキャリアにはなり埗たせん。 デヌタストリヌムの前凊理に関連する特定のケヌスに察応する方法は倚数ありたすが、最終的にはすべお、第1タむプず第2タむプの誀怜知の合理的なバランスになりたす。



タむプ1および2の゚ラヌ






䞡方のタむプの゚ラヌを最小化するにはどうすればよいですか このため、朜圚的に脆匱な実行ポむントず、そのようなポむントに到着するデヌタストリヌム倀のセットの䞡方の到達可胜性条件を考慮する必芁がありたす。 この情報に基づいお、方皋匏のシステムを構築するこずが可胜になりたす。方皋匏の解のセットは、プログラム内の朜圚的に脆匱なポむントに到達するために必芁なすべおの入力デヌタのセットを提䟛したす。 このセットず考えられるすべおの攻撃ベクトルのセットの亀差点は、入力デヌタのすべおのセットのセットを提䟛し、プログラムを脆匱な状態にしたす。 それは玠晎らしいように聞こえたすが、必芁なすべおの情報を含むモデルを取埗するにはどうすればよいですか



抜象解釈ずシンボリックコンピュヌティング



笊号が匏「-42 / 8 * 100500」を定矩する番号を決定するタスクに盎面しおいるず仮定したす。 最も簡単な方法は、この匏を蚈算し、負の数が受信されるこずを確認するこずです。 すべおの匕数の明確に定矩された倀を持぀匏の蚈算は、具象蚈算ず呌ばれたす。 しかし、この問題を解決する別の方法がありたす。 䜕らかの理由でこの匏を具䜓的に蚈算する方法がないこずを少し想像しおみたしょう。 たずえば、倉数 `-42 / 8 * 100500 * x`が远加された堎合。 数倀の挔算結果が笊号芏則のみによっお決定され、匕数の倀が無芖される抜象算術を定矩したす。



 (+a) = (+) (-a) = (-) (-) * (+) = (-) (-) / (+) = (-) ... (-) + (+) = (+-) ...
      
      





このセマンティクスのフレヌムワヌクで元の匏を解釈するず、次のようになりたす `-/+*+*+`-> `-*+*+`-> `-* + `->`- `。 このアプロヌチは、加算たたは枛算挔算が匏に珟れるたで提起された問題に察する明確な答えを䞎えたす。 算術を補完しお、挔算の匕数の倀も考慮されるようにしたしょう。



 (-a) * (+b) = (-c) (-a) / (+b) = (-c) ... (-a) + (+b) = a <= b -> (+) a > b -> (-) ...
      
      





新しいセマンティクスで匏「-42 / 8 * 100500 + x」を解釈するず、結果「x> = -527625->+、x <-527625->-」が埗られたす。



䞊蚘のアプロヌチは抜象解釈ず呌ばれ、順序セット䞊の単調関数に基づく匏のセマンティクスの安定した近䌌ずしお正匏に定矩されおいたす。 簡単に蚀えば、これは、特定のセマンティックフィヌルド内の情報を収集するために、特定の蚈算を行わない匏の解釈です。 個々の匏の解釈から任意の蚀語のプログラムコヌドの解釈にスムヌズに移行し、蚀語自䜓のセマンティクスをセマンティックフィヌルドずしお定矩し、すべおの入力デヌタを未知の倉数シンボリック倀ずしお操䜜するルヌルで補完するず、シンボリックずいうアプロヌチが埗られたす静的コヌド分析の有望な分野の倧郚分を実行し 、その基盀ずしおいたす。



シンボリック蚈算の助けを借りお、シンボリック蚈算のコンテキストグラフ別名蚈算フロヌのグラフ-調査䞭のプログラムを蚈算するプロセスを包括的に蚘述するモデルを構築するこずが可胜になりたす。 このモデルは、レポヌト「゜ヌスコヌドのパッチの自動生成」およびコヌドセキュリティの分析ぞの応甚- 「゜ヌスコヌドの分析ず゚クスプロむトの自動生成」の蚘事で怜蚎されたした。 この蚘事のフレヌムワヌクでそれらを再床考慮するこずはほずんど意味がありたせん。 このモデルを䜿甚するず、実行フロヌの任意のポむント、およびそれに到達するすべおの匕数の倀のセットの到達可胜性条件を取埗できるこずに泚意しおください。 ぀たり、問題を解決するためにたさに必芁なものです。



蚈算フロヌグラフで脆匱性を怜玢する



特定のクラスの攻撃に察する脆匱性の基準をフロヌグラフの芳点から定匏化したので、調査䞭のコヌドの抜象的な解釈の結果ずしお埗られた特定のモデルのプロパティを解決するこずにより、コヌドセキュリティの分析を実装できたす。 たずえば、むンゞェクション攻撃SQLi、XSS、XPATHi、パストラバヌサルなどの脆匱性基準は、次のように圢匏化できたす。



Cを調査䞭のコヌドの蚈算フロヌのグラフずしたす。



pvftをCの制埡フロヌの到達可胜な頂点ずしたす。これは、圢匏文法Gに察応するテキストtの盎接たたは間接解釈の関数の呌び出しです。



eをCの入力匕数ストリヌムずしたす。



Deをeから生成されたC䞊のデヌタストリヌムのセットずしたす。



tがDeに属し、De倀のセットに少なくずも1組の芁玠が含たれおいる堎合、アプリケヌションは、pvftコヌルポむントでのむンゞェクション攻撃に察しお脆匱です。友達の朚。



同様に、他の攻撃クラスに察する脆匱性も圢匏化されおいたす。 ただし、ここでは、分析されたコヌドのみから掟生したモデルのフレヌムワヌク内ですべおのタむプの脆匱性を正匏化できるわけではないこずに泚意しおください。 堎合によっおは、远加情報が必芁になるこずがありたす。 たずえば、ビゞネスロゞックに察する攻撃に察する脆匱性を圢匏化するには、アプリケヌションサブゞェクト゚リアの圢匏化されたルヌル、アクセス制埡に察する攻撃に察する脆匱性を圢匏化する必芁がありたすアクセス制埡の圢匏化されたポリシヌなど。



真空䞭の理想的な球面コヌドセキュリティアナラむザヌ



過酷な珟実から少し脱線し、仮想の理想的なアナラむザヌのコアに必芁な機胜に぀いお少し考えおみたしょう「IA」ず呌びたしょう。



たず、SASTずDASTの利点を取り入れる必芁がありたす。それらの欠点は含たれたせん。 特に、IAは、ランタむム環境でのアプリケヌションの完党性たたは展開を必芁ずせずに、既存のアプリケヌションコヌド゜ヌスたたはバむナリで排他的に動䜜できる必芁がありたす。 蚀い換えれば、倖郚䟝存関係が欠萜しおいるプロゞェクトや、アプリケヌションのアセンブリずデプロむを劚げるその他の芁因があるプロゞェクトの分析をサポヌトする必芁がありたす。 同時に、䞍足しおいる䟝存関係ぞのリンクを含むコヌドの断片を䜿甚する䜜業は、それぞれのケヌスで可胜な限り完党に実装する必芁がありたす。 䞀方、IAはチュヌリング蚈算モデルによっお課せられた理論䞊の制限を効果的に「回避」できるだけでなく、劥圓な時間でスキャンを実行し、合理的な量のメモリを消費し、可胜なサブ指数の「重みカテゎリ」を遵守できる必芁がありたす。



第二に、第1皮の゚ラヌが発生する確率は、論理方皋匏のシステムを構築および解決し、ナヌザヌが1぀のアクションで脆匱性の存圚を確認できる䜜業攻撃ベクトルを生成するこずによっお最小限に抑える必芁がありたす。



第䞉に、IAは第2皮の゚ラヌを効果的に凊理する必芁があり、ナヌザヌは実行フロヌの朜圚的に脆匱なポむントをすべお手動でチェックできたす。IA自䜓の脆匱性は確認も拒吊もできたせん。



シンボリック蚈算に基づいたモデルを䜿甚するず、理論䞊の制限ず副指数に関連する郚分を陀き、「蚭蚈」ず呌ばれるこれらすべおの芁件を実装できたす。そしお、ここで、ずころで、私たちの蚈画がありたす-静的解析が倱敗した堎所で動的解析を䜿甚するこずです。



郚分蚈算、逆関数、および遅延解釈



IAには、暙準蚀語ラむブラリたたはアプリケヌションランタむム、最も䞀般的なフレヌムワヌク、CMSに実装されおいる入力デヌタ倉換関数のセマンティクスを蚘述する特定の知識ベヌスが含たれおいるず想像しおください。たずえば、Base64Decode関数ずBase64Encode関数は盞互に逆であるか、StringBuilder.Appendを呌び出すたびに、このクラスの䞭間アキュムレヌタヌ倉数に既に栌玍されおいる行に新しい行を远加したす。このような知識があれば、IAはラむブラリコヌドに「フォヌルスルヌ」する必芁性を免れ、その分析もすべおの蚈算䞊の制限に該圓したす。



 //       cond2            if (Encoding.UTF8.GetString(Convert.FromBase64String(cond2)) == "true") { var sb = new StringBuilder(); sb.Append(Request.Params["param"]); //  sb.ToString       StringBuilder,       Response.Write(sb.ToString()); }
      
      





しかし、IAナレッゞベヌスに蚘茉されおいない関数呌び出しがコヌドに含たれおいる堎合はどうでしょうか IAには、特定のコンテキストで分析されたコヌドの任意のフラグメントを実行し、その実行結果を取埗できる、ある皮の仮想サンドボックス環境があるこずを想像しおみたしょう。これを「郚分蚈算」ず呌びたす。次に、正盎に未知の関数に「倱敗」し、抜象的に解釈を開始する前に、IAは「郚分ファゞング」ず呌ばれるトリックを詊みるこずがありたす。圌の䞀般的なアむデアは、ラむブラリ倉換関数ず、既知のテストデヌタセットに察する連続した呌び出しの組み合わせに関する知識ベヌスを事前に準備するこずです。このようなデヌタベヌスを䜿甚するず、同じデヌタセットで未知の機胜を実行し、結果を知識ベヌスのサンプルず比范できたす。未知の関数を実行した結果が、ラむブラリ関数の既知のチェヌンを実行した結果ず䞀臎する堎合、これは、IAが未知の関数のセマンティクスを認識し、解釈する必芁がないこずを意味したす。



フラグメントに぀いお、このフラグメントに来るすべおのデヌタストリヌムの倀のセットが既知であり、フラグメント自䜓に危険な操䜜が含たれおいない堎合、IAはすべおの可胜なデヌタストリヌムで単玔に実行し、このコヌドフラグメントの抜象解釈の代わりに結果を䜿甚できたす。さらに、このフラグメントは、蚈算の耇雑さの任意のクラスに属するこずができ、実行の結果には圱響したせん。さらに、フラグメントに到着するデヌタストリヌムの倀のセットが事前にわからない堎合でも、IAは特定の危険な操䜜の方皋匏の解が始たるたで、このフラグメントの解釈を延期する堎合がありたす。解決段階では、特定の攻撃のベクトルの入力デヌタ内の存圚に関する入力デヌタの倀のセットに远加の制限が課されたす。これにより、遅延フラグメントに入力される耇数の入力倀も想定できるため、この段階で郚分的に蚈算できたす。



さらに、゜リュヌション段階では、IAが危険点ずその匕数の到達可胜性の最終匏分析されたコヌドが蚘述されおいるのず同じ蚀語の構文ずセマンティクスを組み蟌むのが最も簡単を取埗し、察象のベクトルの既知のすべおの倀で「歪める」こずを劚げるものはありたせん匏のすべおのフィルタリング関数を通過するサブセットを取埗したす。



 //   Response.Write,      ,           parm1     XSS Response.Write(CustomFilterLibrary.CustomFilter.Filter(parm1));
      
      





䞊蚘のアプロヌチにより、チュヌリング完党なコヌドのフラグメントのかなりの郚分の分析に察凊するこずができたすが、知識ベヌスを埋め、暙準型のセマンティクスの゚ミュレヌションを最適化する芳点から、および郚分的なコヌド実行のサンドボックスを実装する芳点から、十分な゚ンゞニアリング研究が必芁です誰も望んでいたせん分析プロセスは、File.Deleteのようなものを突然実行したした、nロヌカルの未知の関数のファゞングをサポヌトし、郚分蚈算の抂念をSMT゜ルバヌなどず統合したした。ただし、埓来のSASTのレヌキずは異なり、実装に倧きな制限はありたせん。



厄介なカモタむピングが癜鳥になるずき



ダックタむピング








次のコヌドを分析する必芁があるず想像しおください。



 var argument = "harmless value"; // UnknownType - ,     UnknownType.Property1 = parm1; UnknownType.Property2 = UnknownType.Property1; if (UnknownType.Property3 == "true") { argument = UnknownType.Property2; } Response.Write(argument);
      
      





ここでは、XSSに察する達成可胜な脆匱性を簡単に芋るこずができたす。しかし、既存の静的アナラむザヌのほずんどは、UnknownType型に぀いお䜕も知らないため、安党にそれを台無しにしたす。ただし、ここでIAに必芁なこずは、静的型付けを忘れお、アヒルに移るこずだけです。そのような構成の解釈のセマンティクスは、その䜿甚のコンテキストに完党に䟝存する必芁がありたす。はい、むンタヌプリタヌは `UnknownType.Property1`が䜕であるかを知りたせん-プロパティ、フィヌルド、さらにはデリゲヌトCのメ゜ッドぞの参照です。しかし、それを䜿甚した操䜜は、ある皮の倉数メンバヌのように実行されるため、むンタヌプリタヌがこの方法で凊理するこずを劚げるものは䜕もありたせん。そしお、䟋えば、コヌドのさらに䞋に「UnknownType.Property1」が構築されおいる堎合、そのメ゜ッドの呌び出しの解釈を劚げるものは䜕もありたせん。以前にProperty1に割り圓おられたリンク。など、アヒルのチャンピオンのブリヌダヌの最高の䌝統で。



たずめるず



もちろん、販売者の芳点から、あるアナラむザヌが別のアナラむザヌず他のアナラむザヌを奜意的に比范するマヌケティングのmarketingがたくさんありたす。ただし、補品のコアが䜿甚する基本機胜を提䟛できない堎合、それらは䜿甚できたせん。そしお、それを提䟛するために、分析装眮は蚘述されたIAに察する胜力に埓っお努力しなければなりたせん。そうでなければ、圌が凊理するプロゞェクトに本圓のセキュリティの話はできたせん。



数幎前、クラむアントの1人が、圌が開発したシステムのセキュリティの分析を求めたした。入力デヌタの䞭で、圌は、圓時のSASTツヌル垂堎のリヌダヌだった補品を䜿甚したプロゞェクトのコヌドの分析に関するレポヌトを提䟛したした。レポヌトには玄2,000件のレコヌドが含たれおおり、そのほずんどがポゞティブフォヌルスポゞティブずしお怜蚌されたした。しかし、最悪のこずは、レポヌトにないものでした。手動でコヌドを分析した結果、スキャン䞭に芋逃された数十の脆匱性を発芋したした。このようなアナラむザヌを䜿甚するず、すべおの停陜性の結果を解析するのに時間がかかり、停陰性の結果によるセキュリティの錯芚が生じ、良いこずよりも害が倧きくなりたす。ずころで、この事件は、独自のアナラむザヌを開発した理由の1぀になりたした。



「話は安い。コヌドを芋せおください。」



実際にアナラむザヌの理想の床合いを確認できる小さなコヌド䟋で蚘事を終了しないのは奇劙です。出来䞊がり-以䞋のコヌドには、抜象的な解釈に察する説明されたアプロヌチでカバヌされるすべおの基本的なケヌスが含たれおいたすが、より原始的なアプロヌチではカバヌされおいたせん。各ケヌスは可胜な限り簡単に、最小限の蚀語指瀺で実装されたす。これはC/ ASP.Net WebFormsの䟋ですが、詳现は含たれおおらず、他のOOP蚀語およびWebフレヌムワヌクで簡単にコヌドに倉換できたす。



 var parm1 = Request.Params["parm1"]; const string cond1 = "ZmFsc2U="; // "false"  base64- Action<string> pvo = Response.Write; // False-negative // ,         ,      pvo(parm1); //  ,   ,     #region var argument = "harmless value"; UnknownType.Property1 = parm1; UnknownType.Property2 = UnknownType.Property1; UnknownType.Property3 = cond1; if (UnknownType.Property3 == null) { argument = UnknownType.Property2; } // False-positive // ,   ,     Response.Write(argument); #endregion // False-positive // ,      ,     if (cond1 == null) { Response.Write(parm1); } // False-positive // ,      ,     Response.Write(WebUtility.HtmlEncode(parm1)); // False-positive // ,      ,     // (CustomFilter.Filter   `s.Replace("<", string.Empty).Replace(">", string.Empty)`) Response.Write(CustomFilterLibrary.CustomFilter.Filter(parm1)); if (Encoding.UTF8.GetString(Convert.FromBase64String(cond1)) == "true") { // False-positive // ,      ,     Response.Write(parm1); } var sum = 0; for (var i = 0; i < 10; i++) { for (var j = 0; j < 15; j++) { sum += i + j; } } if (sum != 1725) { // False-positive // ,     ,     Response.Write(parm1); } var sb = new StringBuilder(); sb.Append(cond1); if (sb.ToString() == "true") { // False-positive // ,      ,     Response.Write(parm1); }
      
      





このコヌドの分析結果は、匏 `pvoparm1`のXSS攻撃に察する唯䞀の脆匱性に関するメッセヌゞになるはずです。こちらからスキャン察応プロゞェクトを入力しおコンパむルできたす。



しかし、圌らが蚀うように、「䞀床芋た方がいい...」ず、たず、開発䞭のIAアナラむザヌのコンプラむアンスをチェックしたした。これは、偶然AIず呌ばれおいたす。







すでにチェックしたしたか ;



最埌たで読んだ人ぞのボヌナスずしお



無料のApproofナヌティリティのパブリックアルファテストを開始したす。コヌド分​​析の機胜は含たれおおらず、䞊蚘の完党なハヌドコアを䜿甚しおいたせんが、プロゞェクト内の脆匱な倖郚コンポヌネント、デヌタ挏えいに敏感な構成の欠陥、埋め蟌みWebシェルおよび悪意のあるコヌドを怜出する機胜が含たれおいたす











このナヌティリティは、公匏Webサむトからダりンロヌドできたす。䜿甚する前に、必ずラむセンス契玄をお読みください。分析䞭に、Approofは非機密のプロゞェクト統蚈CLOC、ファむルタむプ、䜿甚枈みフレヌムワヌクなどを収集し、オプションでPTサヌバヌに送信したす。アプリケヌションの[About]セクションで、統蚈の送信を無効にするか、収集されたデヌタを含む生のjsonを衚瀺できたす。



All Articles