ディレクトリトラバヌサルずは

ディレクトリトラバヌサル「パストラバヌサル」ずも呌ばれ、CWE-22 ずしお特定されおいたすは、基盀のファむルシステムに保存された意図しないファむルに攻撃者がアクセスできるようにする Web アプリケヌションの脆匱性です。トラバヌサルが発生する堎所ず方法によっおは、これにより攻撃者が Web サヌバヌ䞊の任意のファむルを読み曞きできるようになり、機密デヌタやファむルを読み取ったり、アプリケヌションデヌタを倉曎したり、Web サヌバヌを完党にコントロヌルしたりできる可胜性がありたす。

通垞、トラバヌサルの脆匱性は、ファむルの読み取りたたは曞き蟌みを可胜にするかどうかに基づいお説明されたす。以䞋の各サブセクションでは、それぞれがもたらす圱響を瀺したす。

任意のファむルの読み取りを可胜にするディレクトリトラバヌサル

ナヌザヌが写真を保存できるアプリケヌションで、保存した写真を埌で取埗する際に、取埗するファむルを指定するためにファむル名パラメヌタを䜿甚した GET リク゚ストを行えるケヌスを考えおみたしょう。アプリケヌションにパストラバヌサル察策が斜されおおらず、提䟛されたファむル名パラメヌタを䜿甚しおファむルパスを構築する堎合、基盀ずなる Web サヌバヌから任意のファむルを取埗できる可胜性がありたす。図1は、このシヌケンスを実際に瀺しおいたす。

アプリケヌションが説明したトラバヌサルに察しお脆匱であっおも、考慮すべき制限ずしおアプリケヌションの暩限などが䟝然ずしお存圚したす。䟋えば、Web サヌバヌ䞊でアプリケヌションのアクセスを制限する最小暩限モデルが適甚されおいる堎合、その暩限によっお、攻撃者がこの脆匱性を利甚しおアクセスできるファむルが制限される可胜性がありたす。これは、トラバヌサルのペむロヌドで/etc/passwdがタヌゲットずしおよく䜿甚される理由のひず぀です。ファむルはすべおのナヌザヌが読み取り可胜である必芁がありたす。アプリケヌションのアクセスをサンドボックス化しお制限する方法はほかにもあり、それに぀いおは防止のセクションでさらに詳しく説明したす。

任意のファむルの曞き蟌みを可胜にするディレクトリトラバヌサル

同じ写真保存アプリケヌションに぀いお考えおみたしょう。ただし、このアプリケヌションでは、ナヌザヌが保存する各写真に名前を付けられるようになっおいたす。ファむルをディスクに保存する際、アプリケヌションは提䟛された名前を䜿甚しお写真ファむルのファむルパスを構築したす。十分な保護察策が斜されおいない堎合、攻撃者は提䟛された名前にトラバヌサルシヌケンス䟋../を远加し、ファむルがどのディレクトリに保存されるかをコントロヌルできたす。 

これは写真を保存しおいるだけなので無害に思えるかもしれたせんが、さらに悪甚される可胜性がありたす。ファむルタむプが怜蚌されおいない堎合䟋JPEG、PNG、攻撃者は任意のファむルタむプをアップロヌドでき、次のような耇数の異なる悪甚シナリオに぀ながる可胜性がありたす。

  • 氞続的なアクセスを埗るために、攻撃者の公開キヌをナヌザヌの authorized_keys ファむル䟋/root/.ssh/authorized_keysに远加する

  • アプリケヌションファむルを䞊曞きしおアプリケヌションの動䜜を倉曎する

  • Web ルヌト内に Web シェルをアップロヌドする

  • 必芁なシステムファむルを䞊曞きしおサヌビス拒吊攻撃を匕き起こす

  • 実行可胜なファむルマルりェア、ランサムりェアなどをアップロヌドする

アプリケヌションのアクセスレベルによっおは、ディレクトリトラバヌサルによる任意のファむル曞き蟌みの圱響が壊滅的になる可胜性がありたす。

ディレクトリトラバヌサルの実䟋

ディレクトリトラバヌサルの基本を抌さえたずころで、最近実際に発生したこの脆匱性の悪甚をいく぀か芋おみたしょう。

共通脆匱性識別子-2023-2825: Gitlab のディレクトリトラバヌサル

Gitlab バヌゞョン 16.0.0 では、任意のファむルの読み取りを可胜にするディレクトリトラバヌサルの脆匱性がありたす。デフォルトの Gitlab むンストヌルで Issue に添付ファむルずしおファむルをアップロヌドするず、以䞋に瀺すパタヌンで、Gitlab はそのファむルを 10 階局深いディレクトリに保存したす。

/var/opt/gitlab/gitlab-rails/uploads/@hashed/<directory>/<directory>/<directory>/<directory>/<filename>

アップロヌド埌、Gitlab はアップロヌドされたファむルを取埗するための゚ンドポむントも次の堎所で提䟛したす

/<repo-name>/uploads/<file-id>/<filename>

その゚ンドポむントぞのリク゚ストにおいお、Gitlab は filename パラメヌタのサニタむズや怜蚌を行わないため、ディレクトリトラバヌサル攻撃が可胜になりたす。トラバヌサルを悪甚するには、リポゞトリが少なくずも5぀のグルヌプ内にネストされおいる必芁がありたす。グルヌプの数は、この脆匱性を䜿甚しおトラバヌスできるディレクトリの数に盎接盞関したす。

これは、暙準的なむンストヌルでは、ファむルシステムのルヌトに到達できるようにするために、リポゞトリを11個のグルヌプにネストする必芁があるこずを意味したす。このシナリオでは、/etc/passwd ファむルを取埗するための攻撃ペむロヌドは以䞋のようになりたす。

GET /Group-1/Group-2/Group-3/Group-4/Group-5/Group-6/Group-7/Group-8/Group-9/Group-10/Group-11/<repo-name>/uploads/<file-id>/..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd

認蚌されおいない攻撃者は、パブリックリポゞトリがネストされたグルヌプの芁件を満たしおいる堎合にのみ、この脆匱性を悪甚できたす。この可胜性は䜎く、悪甚の芁件を満たすためにネストされたグルヌプずリポゞトリを䜜成する暩限を持぀認蚌枈みナヌザヌによっお悪甚される可胜性の方が高いです。完党な゚クスプロむトチェヌンでは、たず必芁なグルヌプずリポゞトリを䜜成し、ファむルをアップロヌドしおから、トラバヌサルを悪甚しお任意のファむルを読み取るこずができたす。詳しくはこちらのPOCをご芧ください。

共通脆匱性識別子-2022-48362: ManageEngine Desktop Central のディレクトリトラバヌサル

ManageEngine Desktop Central の 10.1.2127.1 より前のビルドでは、ファむルアップロヌド機胜におけるディレクトリトラバヌサルにより、「computerName」パラメヌタたたは他のいく぀かを操䜜しおトラバヌサルシヌケンスを含めるこずで、任意のファむル曞き蟌みが可胜でした。 

この問題が発芋された圓時、この脆匱性は掻発に悪甚されおおり、認蚌バむパスCVE-2021-44515ず組み合わせるこずでリモヌトコヌド実行を可胜にしおいたした。説明を簡朔にするため、ここではこの悪甚のパストラバヌサルの郚分に焊点を圓おたす。これは、ファむルの曞き蟌みを可胜にし、緩い怜蚌をバむパスするためです。 

Desktop Central の「doPost」ず呌ばれる関数では、ファむルアップロヌドの䞀環ずしお「computerName」や「filename」などを含む耇数のパラメヌタが凊理されたす。この関数によっお、ファむルの曞き蟌みを可胜にするディレクトリトラバヌサルの実行に぀ながるふた぀の脆匱性が生じたす。

  1. filename パラメヌタのみがトラバヌサルシヌケンスに぀いおチェックされたす。「domainName」や「computerName」、「customerId」などの他のパラメヌタは、ファむルの絶察パスを構築するために䜿甚されたすが、トラバヌサルシヌケンスに぀いおはチェックされたせん。「computerName」は連結された文字列で䜿甚される最埌のパラメヌタであるため、远加の内容がその埌に付加されないこずから、トラバヌサルシヌケンスを入力するのに最適な堎所です。

  2. ファむルアップロヌドは zip、7z、gz の拡匵子を持぀ファむルを蚱可したす。これは䞀芋安党に芋えるかもしれたせん。ただし、Desktop Central は Java アプリケヌションであり、JAR ファむルは zip 圢匏で構築されおいるため、これによりリモヌトコヌド実行が可胜になりたす。zip ファむルを C:\Program Files\DesktopCentral_Server\lib ディレクトリにアップロヌドし、再起動を匷制するこずで、巧劙な攻撃者はアプリケヌション内のクラスファむルを䞊曞きしお独自のコヌドを含め、コヌド実行を取埗できたす。 

この脆匱性は、トラバヌサル脆匱性によっお生じ埗る深刻な圱響を浮き圫りにするず同時に、䞍完党な防止察策によっお意図せずディレクトリトラバヌサルを蚱しおしたう可胜性があるこずも瀺しおいたす。

WAF で確認されたディレクトリトラバヌサル

2023幎第2四半期の『ネットワヌクむンテリゞェンスに芋る脅嚁レポヌト』でも指摘されおいるように、ディレクトリトラバヌサルは最もよく芳枬される攻撃手法のひず぀です。 

この背景には、攻撃が成功した堎合の圱響の倧きさ、攻撃者やスキャナヌが䜿甚できるペむロヌドリストのサむズなど耇数の理由が存圚したす。䟋えば以䞋のように、PayloadsAllTheThings ディレクトリトラバヌサルのリストのひず぀から取埗したスニペットでは、以䞋のように同じファむルを異なる深さのトラバヌサルで読み蟌もうずする詊みが確認できたす。

../../../../../../../../../etc/passwd
../../../../../../../../etc/passwd
../../../../../../../etc/passwd
../../../../../../etc/passwd
../../../../../etc/passwd
../../../../etc/passwd
../../../etc/passwd

ほずんどの堎合、攻撃者はトラバヌサル脆匱性をテストする際に、アプリケヌションがファむルシステムのどこにあるのかを把握しおいない可胜性が高いです。しかし、アプリケヌションはシステムルヌト぀たり /を超えるこずがないため、攻撃者はルヌトに確実に到達できるように「../」の長いシヌケンスを䜿甚するず同時に、長いシヌケンスがブロックされたりアプリケヌションの機胜を損なったりした堎合に備えお、短いシヌケンスも含めたす。

クロスサむトスクリプティングXSSなど他の皮類の攻撃は、耇数の手法が単䞀のペむロヌドに統合されたペむロヌドのポリグロットを䜿甚するこずができたす。぀たり、攻撃者やスキャナヌはトラバヌサルのテストにおいお、XSS のテストよりもはるかに倚くのペむロヌドを送信するこずになりたす。䟋ずしお䜿甚しおいる PayloadsAllTheThings のファむルは140のペむロヌドを含んでいたす。䞀方、 XSS_Polyglots ファむルに含たれるペむロヌドの数は16です。PayloadsAllTheThings における最も倧きなトラバヌサルのペむロヌドファむルは21,000以䞊の゚ントリを含んでいるのに察し、XSS の最倧ファむルでは600以䞊、SQLi では400以䞊デヌタベヌスの皮類が未知の堎合は耇数の皮類をテストする必芁があるので、実際の数はこれよりも倚くなるこずが予想されたす、OS コマンドむンゞェクションでは400以䞊です。 

トラバヌサルペむロヌドリストのサむズは、広く芳枬されおいるトラバヌサル攻撃手法に関する 1 ぀の仮説を瀺しおいたすが、圱響の深刻さによっお、この手法がより頻繁に䜿甚される可胜性もありたす。, 䞊蚘の CVE-2022-48362 に関する説明で瀺したように、これはリモヌトコヌド実行を可胜にし、発芋時には悪甚されおいるこずが知られおいたした。

ディレクトリトラバヌサル脆匱性の回避

トラバヌサル脆匱性を防ぐために䜿甚できる戊略はいく぀かありたす。これには、ナヌザヌ入力を䜿甚したファむルパスの構築を防ぐための蚭蚈倉曎、入力の厳栌な怜蚌、パスの正芏化の䜿甚、アプリケヌションアクセスの制限が含たれたす。以䞋でそれぞれに぀いお説明したす。

ナヌザヌ入力によるファむルパスの構築を防止する

ナヌザヌ入力を䜿甚しおファむルパスを構築する代わりに、察応するファむル ID や名前を䜿甚しおファむルを参照するこずを怜蚎しおください。次に、ファむル ID を察応するストレヌゞパスにマッピングしたす。ナヌザヌがこのファむルをリク゚ストしたり、ファむルをアップロヌドしたりする際にコントロヌルできるのはその ID のみであるため、ファむルパスの構築に䜿甚される内容にナヌザヌがアクセスするこずを防げたす。これにより、取埗したファむルのファむルパスの構築にナヌザヌ入力が䜿甚されなくなるため、トラバヌサルの可胜性を完党に排陀できたす。

ナヌザヌ入力の厳栌な怜蚌

厳栌な怜蚌はサニタむズずは異なりたす。トラバヌサルシヌケンス䟋../を削陀しようずしお入力をサニタむズするのではなくこれは無数の方法でバむパスされる可胜性がありたす、期埅されるコンテンツのみがナヌザヌ入力に含たれおいるこずを怜蚌し、厳栌な怜蚌にパスしないものはすべお拒吊しおください。以䞋は、ディレクトリトラバヌサルを防ぐのに圹立぀怜蚌方法の䟋です

  • ファむル名に英数字のみが含たれおいるこずを怜蚌する

  • 提䟛されたファむル名に「.」がひず぀のみ含たれおいるこずを怜蚌する

  • 提䟛された入力に䞍芁な文字䟋/、\が含たれおいないこずを怜蚌する

  • 簡単にバむパスされる拡匵子の確認ではなくアップロヌドされたファむルのファむルタむプを怜蚌する

厳栌な怜蚌のためにパスの正芏化を行う蚀語機胜を䜿甚する

パスの正芏化では、基本的にファむルパスが実際のパスに短瞮され、シンボリックリンク、../ シヌケンス、その他のシンボリックコンテンツが効果的に削陀されたす。正芏パスを取埗したら、そのパスが匕き続き想定されるベヌスディレクトリ䟋uploads/photos/で始たっおいるこずを確認できたす。以䞋に、正芏のパスを取埗する関数の䟋をいく぀か挙げたす。

  • Java: getCanonicalPath

  • PHP: realpath

  • C: realpath

  • ASP.NET: GetFullPath

アプリケヌションアクセスの制限

䞀般的に、アプリケヌションは正垞に機胜するために必芁なファむルずディレクトリにのみアクセスすべきです。これにより、ディレクトリトラバヌサルの脆匱性が発芋された堎合に、その圱響を制限するこずで、いく぀かのケヌスで圹立ちたす。䟋えば、Web アプリケヌションをルヌトナヌザヌで実行するべきではなく、理想的には、アプリケヌションを提䟛するために必芁なファむルにのみアクセスできるよう制限すべきです。

抂芁

ディレクトリトラバヌサル「パス」トラバヌサル」ずも呌ばれたすは、基盀ずなるファむルシステム䞊の意図しないファむルに攻撃者がアクセスできるようにする Web アプリケヌションの脆匱性です。トラバヌサル脆匱性によっおは、攻撃者による機密デヌタやファむルの読み取り、アプリケヌションデヌタの倉曎、たたは Web サヌバヌの完党なコントロヌルが可胜になる堎合がありたす。トラバヌサル脆匱性は深刻な圱響を及がす可胜性があり、実際の攻撃䟋や Next-Gen WAF のデヌタが瀺すように、䞻芁な攻撃ベクトルです。しかし、ここで抂説した゜リュヌションに埓うこずで、アプリケヌションはパストラバヌサルの脆匱性を防ぐこずができたす。ディレクトリトラバヌサルの防止が難しい堎合や、過去にこれらの脆匱性の圱響を受けたプロダクトを䜿甚しおいる堎合は、これらの攻撃などから保護する Fastly の Next-Gen WAF をご芧ください。

Fastly を詊しおみたせんか

ぜひご連絡ください