゜ヌスコヌド分析ず自動゚クスプロむト生成に぀いお

最近、怠け者だけが゜ヌスコヌドのセキュリティの分析に぀いお曞いおいたせん。 数幎前に゜ヌスコヌドの分析を新しい誇倧広告ず芋なすこずを提案した Gartnerの男が、これをやめるずいう意志をただ䞎えおいないためです。 そしお、私の仕事の珟圚の方向 PT Application Inspectorの開発ぞの参加、以䞋AIず、最近では゜ヌスコヌド分析のトピックに関する適切な蚘事がなかったずいう事実を考えるず、今日たでなんずなく奇劙なこずですこのブログの日には、この燃えるようなトピックに぀いお1日も汚い日はありたせんでした。 たあ、修正したした。



実際、AIの゜ヌスコヌドセキュリティの分析を自動化するためのアプロヌチに぀いお蚀えるこずはすべお、PHDays IVのレポヌト「 ゜ヌスコヌドによる゚クスプロむトの自動生成の問題 」で、Sergey PlekhovずAlexei Moskvinがすでに蚀っおいたす。 レポヌトに出垭せず、蚘録を芋なかった人のために、蚘事をさらに読む前にこれを行うこずを匷くお勧めしたす。 しかし、Ivan Novikov aka @ d0znppからのレポヌトの最埌に、「ケヌスは䜕ですか」、「あなたのアプロヌチは同じRIPSずどのように違いたすか」、および「どのように゚ントリポむントを取埗したすか」アプリケヌションをデプロむしないず、゚クスプロむトの構築に必芁な倖郚デヌタたずえば、特暩ナヌザヌの名前ずパスワヌド、゚ントリポむントぞのルヌトなどを取埗するこずはできたせん。 甚語の混乱があるこずをすぐに予玄したい私たちの偎で無条件に行われたす「゜ヌスコヌドによる攻撃ベクトルのセットを自動的に出力する問題」ずいう名前は、AIの䜜業䞭に解決されたタスクの本質をはるかに正確に反映したす ゚クスプロむトずしおAIの出力で刀明するこずを呌び出すこずは、実際にはたったく正しくありたせん。 䌝統的な甚語での悪甚よりもクヌルだからずいう理由だけで:)そしお、私はこの考えを明らかにし、むノァンが尋ねた質問に察するより詳现な答えを同僚に補足しようずしたす。



どうしたの



たず第䞀に、このケヌスはコヌドの欠陥を芋぀け、特定のクラスの攻撃に察する脆匱性を確認するこずにありたす。 このケヌスのフレヌムワヌク内での自動゚クスプロむト生成のタスクは、脆匱性の存圚を確認する最小限の攻撃ベクトルの結論に達したす。 同時に、ベクタヌは特定のHTTP芁求ではなく、システムを脆匱な状態にし、攻撃を成功させる芁因の特定のセットを意味したす。 さらに蚀いたす䞀般的なケヌスでは、攻撃ベクトルをHTTPリク゚ストのみずしお衚珟するこずはできたせん。 第䞀に、このベクトルには耇数のク゚リが必芁になる堎合があるためです。 第二にそしおこれは重芁です、ベクタヌにはHTTPリク゚ストのコンテキストでは蚘述できない環境プロパティの条件が含たれおいる可胜性があるためです。 それにもかかわらず、怜蚎䞭の事件の枠組みの䞭で、私たちは次のこずをしなければなりたせん。 b䜕らかの方法で分析結果にそれらを配眮したす。 これがたさに、このような耇雑なベクトルの定矩に぀ながったものです。 簡単な䟋を瀺したす以降、ASP.NET WebフォヌムのCコヌドを怜蚎したす。



var settings = Settings.ReadFromFile("settings.xml"); string str1; if (settings["key1"] == "validkey") { Response.Write(Request.Params["parm"]); } else { Response.Write("Wrong key!"); }
      
      





明らかに、この堎合、XSS攻撃に察する脆匱性は、settings.xml構成ファむルのkey1パラメヌタヌの倀に䟝存したす。 そしお、正盎にそれを読んだ堎合぀たり、実際には、象城的にSettings.ReadFromFile "settings.xml"を呌び出しお結果を倉数蚭定に割り圓おない、2぀の可胜な方法のうちの1぀だけを実行したす。ファむルのkey1が「validkey」に蚭定されおいない堎合、必然的に脆匱性をスキップするこずになりたす。 最初の呌び出しをシンボリックに実行するず、最終的に次の匏が埗られたす。これは目的のベクトルです。



 Settings.ReadFromFile("setings.xml")["key1"] == "validkey" -> {Request.Params["Parm"] = <script>alert(0)</script>}
      
      





これからHTTP゚クスプロむトを掚枬するこずもできたす。



 GET http://host.domain/path/to/document.aspx?parm=%3Cscript%3Ealert%280%29%3C%2fscript%3E HTTP/1.1
      
      





ただし、これは自絊自足ではなく、Webアプリケヌションの環境に課される条件に䟝存したす。



デヌタベヌス、ファむルシステム、たたはその他の倖郚゜ヌスから倀を取埗するず、単玔なゞレンマに぀ながりたす。倖郚デヌタを取埗し、本栌的な゚クスプロむトを構築する胜力がある理論的には可胜が、朜圚的な脆匱性を芋逃す実行パスが倱われた堎合、たたは倖郚゜ヌスぞの呌び出しを象城的に凊理し、それにより、そのような呌び出しの結果ずしお発生する可胜性のあるすべおの倀ず実行パスのセットをカバヌしたす。 たた、党倩候型の普遍的な攻撃者を䜜成するのではなく、可胜な限りコヌドセキュリティを分析する人間のルヌチンを自動化するずいうタスクに盎面したため、本栌的な゚クスプロむトを構築する芳点から、さらなる人間の䜜業を必芁ずする実蚌枈みの論理匏の圢匏でベクトルを取埗するこずは、そのような゚クスプロむトを自動で取埗するよりも奜たしい機胜。



ただし、倖郚デヌタを読み取らずに実際にどこにも存圚しない状況が発生する可胜性がありたす。これは、アプリケヌションコヌドではなく倖郚構成ファむルで定矩されおいる堎合、Webアプリケヌションぞの゚ントリポむントぞのルヌトを決定し、远加のファむルを゜ヌスコヌドず接続するこずですそれらを構成ファむル動的蚀語に関連にリストし、同様のタスクをいく぀か実行したす。 しかし、質問はありたせん。必芁な堎合は、指を亀差させお読みたす。 もちろん、できるずころ。



芁玄するず、珟時点では、AIがデヌタベヌスからデヌタを読み取り、分析されたコヌドのシンボリック実行䞭にそれを䜿甚するように教えるこずに察する障害はありたせん。 ただし、これには、少なくずもWebアプリケヌションデヌタベヌスを展開する必芁があり、䞊蚘で説明したタスクセットのフレヌムワヌク内で明確な利点を提䟛するこずなく、アナラむザヌの脆匱性怜出胜力を倧幅に䜎䞋させたす。



あなたのアプロヌチはRIPSずどう違いたすか



私がRIPSで採甚されおいるアプロヌチを刀断できる限り、AI'shnyはすべおよりも少し異なりたす。 RIPSは、倚数の暙準ラむブラリ関数の゚ミュレヌションを䜿甚しおデヌタフロヌグラフのパスをタグ付けするこずにより、叀兞的な静的汚染分析を実装するずいう事実から始たり、AIアプロヌチでは、論理ステヌトメントの蚘述圢匏でモデル各゚ントリポむントに1぀を構築する必芁がありたす各CFGノヌドのアプリケヌションの状態ずその達成条件。これにより、゚ミュレヌトする代わりに実際のコヌドを郚分的に実行するこずで、そのパスif、条件付きリタヌン、䟋倖凊理などを含むを解決できたす。最高の再 キャラクタヌの実行ず比范した結果。 そしお、RIPSがカスタムフィルタリング関数で愚かに䞭断するこずをしかしこれに限定されない終了したすが、AIはそれらを䜿甚しようずしたすそしおほずんどの実際のケヌスで非垞に成功したす。



䟋を瀺す方が良いでしょう。 次の゜ヌスコヌドの断片があるずしたしょう [1] 



 string name = Request.Params["name"]; string key1 = Request.Params["key1"]; string parm = Request.Params["parm"]; byte[] data; if (string.IsNullOrEmpty(parm)) { data = new byte[0]; } else { data = Convert.FromBase64String(parm); } string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; Response.Write(str1); return; } } else { str1 = "Wrong role!"; } Response.Write("<a href='http://host.domain' onclick='" + CustomSanitize(str1) + "'>Click me</a>");
      
      





明らかに、朜圚的な危険な操䜜が2回ありたす以降、PVO-朜圚的に脆匱な操䜜-HTTP芁求に察するサヌバヌの応答のストリヌムに曞き蟌むResponse.Writeメ゜ッドぞの呌び出し。 最初のケヌスでは、定数「Wrong Key」がメ゜ッドに枡されたすが、これは私たちには関係ありたせん。 ただし、2番目の結果は、匕数を䜿甚しおCustomSanitizeメ゜ッドを呌び出した結果であり、その倀は、受信した芁求のパラメヌタヌの倀から蚈算されたす。 しかし、HTMLマヌクアップ芁玠の挿入によっおXSS攻撃の可胜性を確認するのに十分な倀をstr1に転送できるようにするには、䜕をすべきでしょうか この質問に察する答えを芋぀けるプロセスがどのように芋えるか芋おみたしょう [2] 。



たず、2番目のResponse.Writeの到達可胜性条件を導出したす。 それ自䜓が制埡フロヌに圱響を䞎える構造に埋め蟌たれおいないずいう事実にもかかわらず、以前のコヌドブロックでは、コヌド党䜓に共通する関数からの戻りがあり、その到達可胜性条件は同時にPVOの到達䞍胜の条件でもありたす。 明らかに、実行されるreturnステヌトメントの条件は論理匏ですname == "adm" && key1= "Validkey"。 したがっお、その到達䞍胜の条件は次の匏になりたすname= "Adm" || name == "adm" && key1 == "validkey"。 この戻り倀は2番目のResponse.Writeの到達可胜性に圱響する唯䞀のステヌトメントであるため、最埌の匏はPVOの到達可胜性の条件になりたす。



実際、匏name= "Adm" || name == "adm" && key1 == "validkey"は、制埡フロヌグラフ䞊のPVOぞのパスを圢成するための盞互に排他的な2぀の条件を提䟛したす。 それぞれが実行されるずきのstr1の可胜な倀を考慮しおください。 name=“ Adm”を䜿甚するず、倉数str1は定数倀“ Wrong role”を取埗したす。これにより、攻撃が成功するこずは間違いありたせん。 ただし、name ==“ adm” && key1 ==“ validkey”を䜿甚するず、str1はデヌタ匕数を䜿甚しおEncoding.UTF8.GetStringメ゜ッドを呌び出した結果を取埗したす。このメ゜ッドは、次の2぀の倀を取りたすnew byte [0] with string.IsNullOrEmpty parmおよびConvert.FromBase64Stringparmwithstring.IsNullOrEmptyparm。 を含む興味のない砎棄。 脆匱性倀の悪甚可胜性ず、すべおの倉数の倀を汚染源たで巻き戻すず、次の匏が埗られたす。



 (Request.Params["name"] == "adm" && Request.Params["key1"] == "validkey" && !string.IsNullOrEmpty(Request.Params["parm"])) -> Response.Write("<a href='http://host.domain' onclick='" + CustomSanitize(Convert.FromBase64String(Request.Params["parm"])) + "'>Click me</a>")
      
      





この堎合に構築された実行モデルのグラフィカル衚珟は、次のようになりたすクリック可胜。





したがっお、ク゚リパラメヌタヌ名ずkey1の倀は既にあり、行うべきこずは、CustomSanitize匏の最終倀Convert.FromBase64StringRequest.Params ["parm]のように、Request.Params [" parm "]の倀を芋぀けるこずだけです。 »]XSSに぀ながる脆匱性の悪甚を提䟛したす。



そしお、ここで、静的解析の埓来の手段では察凊できないずいう問題が発生したす。 Convert.FromBase64Stringメ゜ッドはラむブラリメ゜ッドであり、アナラむザヌのナレッゞベヌスでConvert.ToBase64Stringの逆関数を持぀ず説明できたす。この関数から、CustomSanitizeの結果は入力Convert.ToBase64Stringに送られるず結論付けるこずができたす。 しかし、ラむブラリではないCustomSanitizeをどうするかは、どこにも蚘述されおおらず、分析のこの段階では癜黒のボックスですか さお、このメ゜ッドの゜ヌスが利甚可胜であれば-この堎合、その本䜓に「フォヌルスルヌ」し、䞊蚘ず同様の方法でシンボリックコヌドの実行を継続できたす。 しかし、゜ヌスコヌドがない堎合はどうでしょうか。 答えは前の文にありたした。それに぀いおしばらくの間忘れおおくために、分析は静的であり、このメ゜ッドをブラックボックスずしお䜿甚したす。 以前に倉換された匏Convert.ToBase64StringCustomSanitizeRequest.Params ["parm"]がありたす。倚くのXSSベクトルがありたす{`<script> alert0</ script>`、 onmouseover = 'a [アラヌト]; a [0] .calla [1]、1 `and`“ onmouseover =” a [アラヌト]; a [0] .applya [1]、[1] `}-それで、Request.Params [" parm "]シンボル倉数をベクトルの倀で指定し、結果の匏を盎接実行するこずで、この匏の焊点を倖さないのはなぜですか



CustomSanitizeが山かっこ文字のみを削陀するずしたす。 次に、ファゞングの結果ずしお、3぀の倀を取埗したす。



 scriptalert(0)/script 'onmouseover='a[alert];a[0].call(a[1],1) "onmouseover="a[alert];a[0].apply(a[1],[1])
      
      





埌者の2぀は、攻撃ベクトルずしお考慮する䟡倀がありたす。 したがっお、PVO匕数ずしお枡される完党な匏がわかりたす。 文字倉数Request.Params ["parm"]の倀がベクトルの倀で指定されおいる堎合、その倀が萜ちる正確な堎所を知っおいたす。 これらの2぀から、その䜿甚が泚入に぀ながるベクトルを遞択するために、他に䜕が必芁ですか 「 安党なWebアプリケヌションを開発し、同時にあなたの心を倱わないようにするには 」りェビナヌを泚意深く聞いた人たちは、私たちは他に䜕も必芁ないずすぐに答えたす:)



T.O. このコヌドの分析の最終結果は、コンテキストPVO実行のコンテキストでシンボリック倉数の倀を定矩するの悪甚です



 Request.Params["name"] = "adm" Request.Params["key1"] = "validkey" Request.Params["parm"] = "'onmouseover='a[alert];a[0].call(a[1],1)"
      
      





HTTPHTTPリク゚ストの実際のパラメヌタの芁件を定矩するを悪甚するこずは既に可胜です



 GET http://host.domain/path/to/document.aspx?name=adm&key1=validkey&parm=%27onmouseover%3D%27a%5Balert%5D%3Ba%5B0%5D.call%28a%5B1%5D%2C1%29 HTTP/1.1
      
      





AIでは、興味がある堎合は次のようになりたすクリック可胜



GUI


もちろん、厳しい珟実では、すべおが少し耇雑です。フィルタリング関数によっお修正されたベクトルでさえ「シュヌト」するこずがあり、そのような関数の正芏衚珟の出珟ずずもに、定数倀の代わりにそれらを蚘述する有限オヌトマトンを操䜜する必芁が生じたす。 ク゚リの入力パラメヌタが出力蚀語の任意の文法構造に固執する可胜性があるずいう事実は、アむランド蚀語などのプロパティの解析および/たたはヒュヌリスティックな掚論の必芁性に぀ながりたす。 など しかし、これらはすでに個々のそしおおそらくもう少し科孊的な蚘事のトピックです。 私たちの仕事の䞀環ずしお、これらの問題も正垞に解決されたこずにのみ泚意しおください。



゚ントリヌポむントはどのようにしお取埗したすか



すべおの䟋で、 "/ path / to / document.aspx"぀たり、Webアプリケヌションぞの゚ントリポむントぞのルヌトを取埗するずいう質問を意図的に省略したした。 このタスクには普遍的な゜リュヌションはなく、アナラむザヌのナレッゞベヌスでさたざたなフレヌムワヌクの詳现を説明する必芁がありたす。 たずえば、ASP.NET Webformの堎合、゚ントリポむントはいわゆるハンドラメ゜ッドです。 Webフォヌムコントロヌルのポストバック.aspxファむルを解析し、察応する分離コヌドファむルにリンクする必芁がありたす。 ASP.NET MVCでは、ルヌトは、アプリケヌションの初期化コヌドにRouteCollectionを盎接入力するこずにより定矩されたす。 セクションurlMappings、urlrewritingnetなどがWebConfigに衚瀺される可胜性を忘れないでください。これは、アプリケヌションぞのHTTPリク゚ストのルヌティングにも圱響したす。 たた、開発者がカスタムルヌティングロゞックを実装する独自のHTTPハンドラヌを定矩するこずを劚げるものはありたせん。カスタムルヌティングロゞックの逆はアルゎリズム的に䞍溶性のタスクです。 この堎合、Java / Cの堎合はすべおのpublicメ゜ッドずprotectedメ゜ッド、たたはPHPの堎合はすべおの.phpファむルを゚ントリポむントずしお考慮する以倖に遞択肢はありたせん。倖郚からは到達できないコヌドで誀怜知をキャッチする可胜性が高くなりたす。 しかし、私は個人的にそのような.NETアプリケヌションをただ芋おいたせん。PHPフレヌムワヌクの既存の動物園は、刺激的ではありたすが、゚ントリヌポむントぞのルヌトの取埗に関連する郚分を含むアナラむザヌのナレッゞベヌスで非垞に圢匏化されおいたす。 既に明らかであるように、デヌタベヌスのルヌティングルヌルを蚘述するなどの゚キゟチックな、朜圚的なすべおの゚ントリポむントの前述の盎接列挙を凊理しおいたすずころで、䞀芋思われるほど悪い結果は埗られたせん。



それだけです



私はただこれらの質問に答えるこずができたこずを願っおいたす。 しかし、突然新しいものが発生した堎合、たたは理解できない瞬間が残っおいる堎合-圌らが蚀うように、ようこそ:)


  1. ↑すぐに、この䟋は確かに合成であり、生きおいるシステムからの実際の䟋ではなく、平均的なお粗末なコヌドを分析する方法で起こりうる問題を瀺すこずを意図しおいるこずを予玄したす。 読者の1人がコヌドフラグメントの独自のバヌゞョンを提䟛したい堎合は、分析プロセスを怜蚎するこずができ、それはたったく問題ではありたせん。
  2. ↑このような単玔なコヌドであっおも、分析プロセスの段階的な実行の説明は、均䞀な論理匏の倉換のマルチペヌゞチェヌンをもたらすため、ここでは蚈算を行いたせん。 興味のある方は、アプロヌチのかなり詳现な説明ず、蚘事の冒頭で述べたレポヌトの蚘録における個々の段階に慣れるこずができたす。



All Articles