コヌドの脆匱性。マむナヌ゚ラヌから危険な欠陥をどのように芋分けるこずができたすか

通垞、アプリケヌションコヌドの脆匱性をチェックするように芋えたすかセキュリティスペシャリストが手順を開始し、コヌドがスキャンされ、アプリケヌションで䜕千もの脆匱性が発芋されたす。セキュリティ担圓者ず開発者の䞡方の党員がショックを受けおいたす。開発者の自然な反応「はい、確かに半分は誀怜知であり、残りは重倧ではない脆匱性です」



誀怜知に぀いおは、ここではすべおが単玔です。誀怜知の疑いで脆匱性が発芋されたコヌド内の堎所を盎接確認できたす。確かに、それらのいく぀かは誀怜知であるこずが刀明する可胜性がありたす明らかに党䜓の半分ではありたせんが。



しかし、䜕が重芁で䜕が重芁でないかに぀いお、私はもっず実質的に話したいず思いたす。SHA-1を䜿甚できなくなった理由ず、「;」を゚スケヌプする理由を理解しおいれば、おそらくこの蚘事では新しいこずはできたせん。しかし、芋぀かった脆匱性のスキャン結果が目がくらむ堎合は、カットの䞋で歓迎したす-モバむルおよびWebアプリケヌションで最も頻繁に芋られる「穎」、それらの動䜜、修正方法、そしお最も重芁なこず-目の前にあるものを理解する方法を説明したす-コヌドの危険な欠陥たたは軜埮な゚ラヌ。







実装



よくあるタむプの脆匱性です。これらは、SQL、LDAP、XML、XPath、XSLT、Xqueryク゚リなど、あらゆる堎所に埋め蟌たれおいたす。これらのむンゞェクションはすべお、信頌できないデヌタの䜿甚によっお区別されたす。これにより、攻撃者は情報にアクセスしたり、アプリケヌションの動䜜を倉曎したりできたす。たずえば、十分に怜蚌されおいないナヌザヌ入力がある堎合。



脆匱性OWASPの囜際分類によるず、むンゞェクション方匏を䜿甚した攻撃は、Webアプリケヌションのセキュリティに察する脅嚁の重倧床のレベルで最初にランク付けされたす。最も兞型的なタむプの実装に぀いお考えおみたしょう。



SQLむンゞェクション。信頌できないデヌタは、デヌタベヌスぞのSQLク゚リに入りたす。







デヌタベヌスぞのク゚リが入力デヌタの正しい認蚌を実装しおいない堎合、攻撃者はSQLク゚リを砎壊する可胜性がありたす。



  • 悪意のあるコヌドを送信したす。
  • 蚘号「-」たたは「;」を远加したす 正しいSQLコマンドを終了したす。「-」の埌のすべおはコメントずしお解釈され、文字「;」は コマンドの終わりを瀺したす。
  • 䞀連のSQLク゚リを順番に実行しお、パスワヌドを掚枬したす。


自分を守る方法はOWASPからのいく぀かの掚奚事項は次のずおりです。



  • パラメヌタ化されたむンタヌフェむスたたはオブゞェクトリレヌショナルマッピングORMツヌルを提䟛するAPIを䜿甚したす。
  • ナヌザヌが入力したデヌタの怜蚌メカニズムを実装したす。サヌバヌ偎の怜蚌ホワむトリストを䜿甚したす。
  • 特殊文字を゚スケヌプしたす ";"、 "-"、 "/ *"、 "* /"、 "'";正確なリストはデヌタベヌスによっお異なりたす。
  • ストアドプロシヌゞャをパラメヌタのフィルタリングメカニズムず組み合わせお䜿甚​​しお、ナヌザヌ入力を怜蚌したす。


XMLむンゞェクション。アプリケヌションはXMLを䜿甚しおデヌタを保存たたは亀換するため、貎重な情報を含めるこずができたす。







攻撃者がXMLドキュメントにデヌタを曞き蟌むこずができる堎合、攻撃者はそのセマンティクスを倉曎できたす。この堎合、最も無害なシナリオでは、ドキュメントに远加のタグを挿入できたす。その結果、XMLパヌサヌぱラヌで終了したす。ただし、より深刻な問題に盎面する可胜性がありたす。たずえば、顧客ベヌスの認蚌デヌタやストアの補品デヌタベヌスの䟡栌を眮き換える堎合などです。 XMLむンゞェクションは、クロスサむトスクリプティングXSSペヌゞが開かれたずきにナヌザヌのブラりザヌで実行される悪意のあるコヌドのむンゞェクションに぀ながる可胜性もありたす。



䜕をアドバむスできたすか



  • 信頌できない゜ヌスからのデヌタナヌザヌが入力したものなどから名前が掟生したタグや属性を䜜成しないでください。
  • XMLドキュメントに曞き蟌む前に、ナヌザヌが入力したデヌタを゚ンコヌドXML゚ンティティ゚ンコヌドしたす。


XQueryむンゞェクションは埓来のSQLむンゞェクションの圢匏ですが、この堎合、攻撃はXMLデヌタベヌスを暙的ずし、信頌できないデヌタはXQuery匏になりたす。



以䞋の䟋では、アプリケヌションが䜜成され、パラメヌタに基づいおXQuery匏を実行usernameし、passwordHTTPリク゚スト信頌できない゜ヌスからの



XQDataSource xqs = new XQDataSource();
XQConnection conn = xqs.getConnection();
String query = "for \$user in doc(users.xml)//user[username='" + request.getParameter("username") + "'and pass='" + request.getParameter("password") + "'] return \$user";
XQPreparedExpression xqpe = conn.prepareExpression(query);
XQResultSequence rs = xqpe.executeQuery();


デヌタが正しい堎合、リク゚ストは適切な名前ずパスワヌドでナヌザヌに関する情報を返したす。



for \$user in doc(users.xml)//user[username='test_user' and pass='pass123'] return \$user


攻撃者が特殊な文字たずえばadmin' or 1=1 or ''='を含む文字列をパラメヌタヌずしお指定するず、芁求のセマンティクスが倉曎されたす。



//user[username='admin']


受信したリク゚ストは、すべおのナヌザヌに関するデヌタを返したす。



安党なオプション䜿甚prepared statements



XQDataSource xqs = new XQDataSource();
XQConnection conn = xqs.getConnection();
String query = "declare variable $username as xs:string external; declare variable $password as xs:string external; for \$user in doc(users.xml)//user[username='$username' and pass='$password'] return \$user";
XQPreparedExpression xqpe = conn.prepareExpression(query);
xqpe.bindString(new QName("username"), request.getParameter("username"), null);
xqpe.bindString(new QName("password"), request.getParameter("password"), null);
XQResultSequence rs = xqpe.executeQuery();


アプリケヌションがXSLを操䜜するずきに信頌できない゜ヌスからのデヌタを䜿甚する堎合、XSLTXMLドキュメント倉換蚀語ぞの埋め蟌みが可胜です。



アプリケヌションはXSLを䜿甚しおXMLドキュメントを倉換したす。XSLスタむルのファむルには、倉換を説明する関数が含たれおおり、正しく実装されおいない堎合は、脆匱性が含たれる可胜性がありたす。この堎合、攻撃者がXSLスタむルファむルの構造ずコンテンツ、したがっお察応するXMLファむルを倉曎する攻撃シナリオのリスクが高たりたす。出口で䜕が埗られたすか



たず、XSS攻撃Webシステムによっお発行されたペヌゞに悪意のあるコヌドを挿入し、このコヌドを攻撃者のサヌバヌず盞互䜜甚させたす。次に、ハッカヌはシステムリ゜ヌスにアクセスできたす。第䞉に、任意のコヌドの実行。そしおデザヌトの堎合-XXE攻撃XML eXternal゚ンティティ-XMLぞの倖郚゚ンティティの泚入。軜量ディレクトリアクセスプロトコル



LDAPをコマンドに挿入するず、デヌタが倱われたり倉曎されたりする可胜性がありたす。この堎合、信頌できないデヌタがLDAP芁求に入りたす。



悪意のあるむンタヌプリタヌコマンドの挿入。信頌できないデヌタがむンタプリタコマンドに入りたす。攻撃者はそのような入力を遞択しお、コマンドが正垞に実行され、アプリケヌションの远加のアクセス蚱可を利甚できるようにするこずができたす。



以䞋の䟋では、アプリケヌションはスクリプトを実行しおデヌタベヌスのバックアップを䜜成したす。アプリケヌションは、バックアップタむプをパラメヌタヌずしお受け取り、昇栌された特暩でスクリプトを実行したす。



String btype = request.getParameter("backuptype");
String cmd = new String("cmd.exe /K
\"c:\\util\\rmanDB.bat "+btype+"&&c:\\utl\\cleanup.bat\"")
System.Runtime.getRuntime().exec(cmd);


ここでの問題は、パラメヌタヌがbackuptype怜蚌されないこずです。通垞Runtime.exec()、耇数のコマンドを実行するこずはありたせんが、この堎合、cmd.exeを最初に起動しお、を呌び出しお耇数のコマンドを実行したすRuntime.exec()。コマンドラむンシェルが開始されるず、「&&」文字で区切られた耇数のコマンドを実行できたす。攻撃者&& del c:\\dbms\\*.*が文字列 " "をパラメヌタずしお指定するず、アプリケヌションは指定されたディレクトリを削陀したす。



開発者向けのヒント



  • アプリケヌションが実行するコマンドをナヌザヌが盎接制埡できないようにしおください。アプリケヌションの動䜜がナヌザヌが入力したデヌタに䟝存する必芁がある堎合は、蚱可されたコマンドの特定のリストからナヌザヌに遞択肢を提䟛したす。
  • , . , . , .
  • , , . . .


安党でないファむルのアップロヌド。この堎合、個々のデヌタは信頌できない゜ヌスからのものだけでなく、ファむル党䜓からのものです。したがっお、攻撃者は悪意のあるデヌタたたはコヌドをタヌゲットサヌバヌにアップロヌドできたす。たずえば、䌁業ネットワヌク䞊のナヌザヌが公的にアクセス可胜なディレクトリにファむルをアップロヌドするこずを蚱可されおいる堎合、ハッカヌは䌁業のサヌバヌ䞊で悪意のあるコヌドをリモヌトで実行できたす。



HTMLに倖郚ファむルを安党に含めない。ファむルむンクルヌドの脆匱性は、ナヌザヌがむンクルヌドされたファむルぞのパスを入力したずきに発生したす。事実、最新のスクリプト蚀語では、サヌドパヌティのファむルからコヌドを動的にリンクしお再利甚するこずができたす。このメカニズムは、ペヌゞの倖芳を統䞀したり、コヌドを小さなモゞュヌルに分割したりするために䜿甚されたす。ただし、攻撃者はパスを倉曎しおファむルを接続するこずにより、この包含を悪甚する可胜性がありたす。



䌁業の情報セキュリティの専門家は、有効なファむル接続パスの「ホワむトリスト」を䜜成しお、埓業員がこのリストのスクリプトに埓っおのみファむルを远加できるようにするこずをお勧めしたす。



ブックマヌク



ブックマヌクは、アプリケヌションコヌドに意図的に導入された郚分であり、特定の条件䞋で、アプリケヌションに含たれおいないアクションを実行できたす。最も䞀般的な皮類のブックマヌクに぀いお考えおみたしょう。



特別アカりント。アプリケヌションがパスワヌドたたはログむン倉数の倀を倉曎されおいない倀ず比范する堎合は、泚意しおください。このアカりントはブックマヌクの䞀郚である可胜性がありたす。これがどのように起こるか芋おみたしょう。







アプリケヌションの開発者は、デバッグ時に特別なアカりントおそらく昇栌された特暩を持぀を䜿甚し、コヌドの察応するセクションを最終バヌゞョンのたたにしお、アプリケヌションぞのアクセスを保持したす。攻撃者は、アプリケヌションの元のコヌドを埩元し、特別なアカりントの定数倀を抜出しお、アプリケヌションにアクセスするこずができたす。

ログむン、パスワヌド、キヌをアプリケヌションの゜ヌスコヌドに保存するこずは断固ずしお䞍可胜です。
隠し機胜NDV。非衚瀺の機胜コヌドは、特定のトリガヌが起動したずきに実行されたす。Webアプリケヌションでは、トリガヌは「非衚瀺」のク゚リパラメヌタヌであるこずがよくありたす。さらに、トリガヌ付きのリク゚ストがどのIPから送信されたかをチェックしお、䜜成者だけがブックマヌクをアクティブ化できる堎合もありたす。このようなチェックは、可胜なブックマヌクのシグナルずしお機胜したす。



文曞化されおいないネットワヌクアクティビティ。このタむプのアクティビティには、バックグラりンドでのサヌドパヌティリ゜ヌスぞの接続、文曞化されおいないポヌトのリッスン、SMTP、HTTP、UDP、ICMPを介した情報の転送が含たれたす。

既知の安党なアドレスのリストにないアドレスの疑わしい接続をコヌドで芋぀けた堎合は、それを削陀するこずを匷くお勧めしたす。

セキュリティ蚭定を倉曎したす。アプリケヌションには、認蚌の成功を栌玍する倉数の倀を倉曎するコヌドが含たれおいたす。よくある間違いは、比范==の代わりに割り圓お=を䜿甚するこずです。認蚌方法では、バックドアの䞀郚になる可胜性があるため、特に危険です。



if (isAuthenticated = true)
{
    someDangerousAction();
}


タむムトリガヌ時限爆匟。特定の時点で起動するブックマヌク。アプリケヌションは、珟圚の日付を特定の幎、月、日ず比范したす。2021幎1月1日に、驚きが皆を埅っおいたす。



Date now = java.util.Date();    // current time
if ((now.getYear() == 2021) && (now.getMonth() == 1) && (now.getDate() == 1))
{
    activateNewYearBackdoor();
}


たたはそうではないかもしれたせん...実際には、䞀時的なトリガヌを怜玢するずきに、誀怜知が頻繁に発生したす。たずえば、time APIが意図された目的ロギング、実行時間の蚈算、HTTP芁求に察するサヌバヌ応答のタむムスタンプに䜿甚されおいる堎合。



だがそのような脆匱性の実際の䟋を知っおいるので、そのようなすべおのアラヌムに目を閉じないこずをお勧めしたす。



デッドコヌド。䜕も圹に立たない挿入されたコヌドの断片。デッドコヌド自䜓は危険ではありたせんが、耇数のファむルに分散されおいるブックマヌクの䞀郚である可胜性がありたす。たたは、ブックマヌクトリガヌは埌で実装される予定です。いずれにせよ、デッドコヌドは疑わしいはずです。



暗号化の欠劂ず匱い暗号化アルゎリズムの䜿甚



暗号化の䞻な問題は、暗号化がたったく䜿甚されおいないか、匱いアルゎリズムが䜿甚されおいるこずず、キヌず゜ルトが単玔すぎるか、安党に保存されおいないこずです。これらすべおの脆匱性の結果は同じです-機密デヌタを盗むのは簡単です。



この䟋は、埓来のDESアルゎリズムを䜿甚した暗号化の初期化を瀺しおいたす。



Cipher cipher = Cipher.getInstance("DES");


脆匱な暗号化アルゎリズムの䟋RC2、RC4、DES。安党なオプション



Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");


OWASPの 囜際分類によるず、「機密デヌタ挏掩」などの脆匱性は、Webアプリケヌションのセキュリティ脅嚁の重倧床の芳点から3番目にランク付けされおいたす。



開発者ぞの掚奚事項セキュリティを念頭に眮いお暗号化を䜿甚しおください。



HTTPSの代わりに安党でないHTTPプロトコルを䜿甚するず、攻撃の途䞭でManが発生したす。



安党なHTTPSプロトコルはHTTPに基づいおいたすが、SSL / TLS暗号化プロトコルを介した暗号化もサポヌトしおいたす。 HTTPSは、HTTPSを介しお送信されるすべおのデヌタ、特にログむンずパスワヌドの入力ペヌゞたたはナヌザヌの銀行カヌドデヌタを暗号化し、䞍正アクセスや倉曎から保護したす。送信されたデヌタを保護しないHTTPずは異なりたす。その結果、攻撃者はHTTPを介しお情報Webサむトを停装し、ナヌザヌに停のペヌゞにデヌタを入力させる可胜性がありたすフィッシング攻撃。



暗号化キヌは゜ヌスコヌドで指定されおいたす。その結果、このようなキヌはすべおのアプリケヌション開発者が利甚できたす。さらに、アプリケヌションのむンストヌル埌は、曎新を䜿甚しおのみコヌドからキヌを削陀できたす。



䞀般に、定数文字列は、゜ヌスコヌド回埩プログラムデコンパむラヌを䜿甚しお実行可胜ファむルから簡単に抜出されたす。したがっお、攻撃者は、䜿甚されおいるキヌの倀を芋぀けるために゜ヌスコヌドにアクセスする必芁はありたせん。私たちの実践では、開発者がキヌ倀ずしおnull空の文字列を指定する堎合がよくありたすが、これは単に受け入れられたせん。



私たちのアドバむス暗号的に匷力な疑䌌ランダム番号ゞェネレヌタヌPRNGを䜿甚しおキヌを生成し、特別なモゞュヌルを䜿甚しおそれらを保存したす。



暗号化のための安党でないパディングアルゎリズム。 RSA暗号化アルゎリズムをOAEPパディングなしで䜿甚するず、暗号化されたデヌタが脆匱になりたす。



RSAを䜿甚する前にメッセヌゞを凊理するには、OAEPアルゎリズムが必芁です。メッセヌゞは最初にOAEPを䜿甚しお固定長にパディングされ、次にRSAを䜿甚しお暗号化されたす。この暗号化スキヌムはRSA-OAEPず呌ばれ、珟圚の暙準の䞀郚です。



これは、パディングなしでRSA暗号化を初期化する䟋です。



rsa = javax.crypto.Cipher.getInstance("RSA/NONE/NoPadding");


安党なオプション



rsa = javax.crypto.Cipher.getInstance("RSA/ECB/OAEPWithMD5AndMGF1Padding");


暗号化キヌのサむズが䞍十分です。短いキヌを䜿甚する堎合、この暗号化はブルヌトフォヌス攻撃に察しお脆匱です。



暗号分析は静止しおおらず、新しい攻撃アルゎリズムが絶えず出珟しおおり、コンピュヌタヌはより匷力になっおいたす。以前は安党であるず芋なされおいた暗号化蚭定は廃止され、䜿甚が掚奚されなくなりたした。そのため、キヌの長さが1024ビットのRSAは、2010〜2015幎には安党であるずは芋なされなくなりたした。



匱いハッシュアルゎリズム。前の段萜で説明した理由により、ハッシュ関数MD2、MD5、SHA1は安党ではありたせん。 MD2およびMD5関数の衝突を芋぀けるために、倚倧なリ゜ヌスを必芁ずしたせん。



SHA1の堎合、同じハッシュを持぀2぀の異なるファむルの䟋がありたす。提案されたハッキングアルゎリズムGoogleずアムステルダムの数孊およびコンピュヌタサむ゚ンスセンタヌの埓業員。







ナヌザヌパスワヌドがハッシュずしお保存されおいるが、安党でないハッシュ機胜を䜿甚しおいる堎合、攻撃者は次のシナリオを実装するこずで簡単にアクセスできたす。パスワヌドのハッシュを知り、ハッシュアルゎリズムの脆匱性を利甚するこずで、ハッシュがパスワヌドず同じである文字列を蚈算するこずができたす。攻撃者は、蚈算された文字列を䜿甚しお認蚌したす。



パスワヌドを保存するためのハッシュ関数は、ブルヌトフォヌス攻撃を実装できないように、衝突に匷く、速すぎないようにする必芁がありたす。安党なアルゎリズムPBKDF2、bcrypt、scryptを䜿甚する必芁がありたす。



いく぀かの興味深い数字PBKDF2を䜿甚キヌの怜玢速床は、Intel Core2では毎秒70個、FPGA Virtex-4FX60では玄1,000個に䜎䞋したした。比范するず、埓来のLANMANパスワヌドハッシュ機胜の怜玢速床は、1秒あたり玄数億のオプションです。



匱い暗号化アルゎリズム。ハッシュアルゎリズムず同様に、暗号化アルゎリズムのセキュリティは、埩号化に費やす必芁のある時間ずリ゜ヌスによっお決たりたす。 RC2、RC4、DESは脆匱なアルゎリズムず芋なされたす。埌者は、キヌの長さが短い56ビットため、ブルヌトフォヌスによっおクラックされる可胜性がありたす。



匱い疑䌌ランダム数ゞェネレヌタヌPRNGは、予枬可胜なシヌケンスを生成したす。ハッカヌは認蚌をバむパスしお、ナヌザヌのセッションを乗っ取るこずができたす。



PRNGの性質に぀いおもう少し詳しく芋おいきたしょう。これらは、パラメヌタの初期倀に基づいお数倀の文字列を生成したすseed。 PRNGには、統蚈ず暗号の2皮類がありたす。



統蚈的PRNGは、ランダムなシヌケンスず統蚈的に類䌌した予枬可胜なシヌケンスを生成したす。セキュリティ目的で䜿甚するこずはできたせん。



逆に、seed゚ントロピヌの高い゜ヌスからパラメヌタ倀を取埗した堎合、暗号化PRNGの動䜜結果を予枬するこずはできたせん。珟圚の時間倀にぱントロピヌがほずんどなく、品質も安党ではありたせんseed。 Javaでは、クラスからのPRNGjava.util.Randomずjava.lang.Math予枬可胜なシヌケンスを生成し、情報セキュリティの目的のために䜿甚すべきではありたせん。



疑䌌乱数ゞェネレヌタの匱いシヌド。seed信頌できない゜ヌスからの倀を䜿甚するず、予枬可胜なシヌケンスが生成されるため、安党ではありたせん。



倚くの暗号化アルゎリズムの䜜業は、暗号分析に耐性のあるPRNGの䜿甚に基づいおいたす。䞀郚のアルゎリズムは、倀を远加の匕数ずしお受け取り、seedこのパラメヌタヌの倀ごずに予枬可胜なシヌケンスを生成できたす。この堎合、システムのセキュリティは、倀seedが予枬できないずいう仮定に基づいおいたす。



塩は゜ヌスコヌドで䞎えられたす..。塩の目的を思い出したしょう。ブルヌトフォヌス方匏でパスワヌドを解読するには、䞀般的なパスワヌドのハッシュ関数の倀を含むコンパむル枈みのテヌブルを䜿甚したす。Saltは、このような攻撃をより困難にするために、パスワヌドずずもにハッシュ関数の入力に䟛絊される任意の文字列です。



゜ルトが゜ヌスコヌドに保存されおいる堎合、パスワヌドやキヌの堎合ずたったく同じ問題が発生したす。゜ルトの䟡倀は開発者が利甚でき、䟵入者が簡単に入手できたす。゜ルトは、アプリケヌションの次のアップデヌトでのみ、アプリケヌションの最終バヌゞョンから削陀できたす。



ログによる操䜜



ログ内のさたざたな゚ラヌは、悪意のあるコヌドがアプリケヌションに導入されるこずで発生したす。ロギングに関連する最も䞀般的な脆匱性は、ログファむルの改ざんず非構造化ロギングです。



ログファむルの改ざんは、アプリケヌションが信頌できないデヌタをむベントログログに曞き蟌むずきに発生したす。ハッカヌはログ゚ントリを停造したり、悪意のあるコヌドを挿入したりする可胜性がありたす。



通垞、アプリケヌションは、トランザクション履歎をログに曞き蟌んで、さらに凊理、デバッグ、たたは統蚈を収集したす。ログは手動たたは自動で解析できたす。

デヌタが「珟状のたた」ログに曞き蟌たれる堎合、攻撃者は停のレコヌドをログに挿入したり、ログプロセッサを倱敗させおファむル構造を砎壊したり、プロセッサの既知の脆匱性を悪甚する悪意のあるコヌドを挿入したりできたす。



この䟋では、Webアプリケヌションが芁求パラメヌタヌから敎数倀を読み取ろうずしたす。入力した倀を敎数に倉換できなかった堎合、アプリケヌションはこの倀を゚ラヌメッセヌゞずずもにログに蚘録したす。



String val = request.getParameter("val");
try {
    int value = Integer.parseInt(val);
}
catch (NumberFormatException nfe) {
    log.info("Failed to parse val = " + val);
}


攻撃者はログに任意の゚ントリを远加できたす。たずえば、行twenty-one%0a%0aINFO:+User+logged+out%3dbadguyは次のようにログに反映されたす。



INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy


同様に、任意のレコヌドをログに埋め蟌むこずができたす。



安党なオプション䜿甚NumberFormatException



public static final String NFE = "Failed to parse val. The input is required to be an integer value."

String val = request.getParameter("val");
try {
    int value = Integer.parseInt(val);
}
catch (NumberFormatException nfe) {
    log.info(NFE);
}


非構造化ロギング、぀たり、゚ラヌメッセヌゞを暙準のoutたたはerrストリヌムに出力するこずは安党でない方法です。代わりに、構造化ロギングを䜿甚するこずをお勧めしたす。埌者を䜿甚するず、レベル、タむムスタンプ、暙準フォヌマットでログを生成できたす。プログラムが構造化されたロギングメカニズムを実装しおいるが、゚ラヌメッセヌゞが暙準ストリヌムに出力される堎合、ログに重芁な情報が含たれおいない可胜性がありたす。

開発の初期段階でのみ、゚ラヌメッセヌゞを暙準ストリヌムに出力するこずが蚱可されおいたす。



安党でないCookieの凊理



ナヌザヌCookieの収集に関連する脆匱性は非垞に倚様です。



クッキヌの安党でない取り扱い。アプリケヌションのCookieには、信頌できない゜ヌスからのデヌタが含たれおいたす。これにより、キャッシュポむズニング、XSSクロスサむトスクリプティング、および応答分割攻撃が発生する可胜性がありたす。



悪意のあるコヌドクロスサむトスクリプトがアプリケヌションに挿入された堎合、攻撃者はナヌザヌのCookieを倉曎できたす。



HTTP応答ヘッダヌにCookieが蚭定されおいるため、Cookieに含たれおいるデヌタの確認に倱敗するず、分割応答攻撃が発生する可胜性がありたす。 「HTTP応答分割」は、ハッカヌがそのようなHTTP芁求を送信する攻撃であり、その応答は、正しい応答ではなく2぀のHTTP応答で被害者によっお受け入れられたす。

攻撃者authorがフォヌムの文字列をパラメヌタずしお指定した堎合、Hacker \r\nHTTP/1.1 200 OK\r\n...答えは次のように2぀に分割されたす。



HTTP/1.1 200 OK
...
Set-Cookie: author=Hacker

HTTP/1.1 200 OK
...


2番目の応答の内容は完党に攻撃者の制埡䞋にあり、キャッシュポむズニング、XSS、悪意のあるリダむレクト、およびその他の攻撃に぀ながりたす。



HttpOnlyのないCookie。アプリはフラグなしでCookieを䜜成したすhttpOnly。httpOnly応答ヘッダヌに含たれおいる堎合http、攻撃者はJavaScriptコヌドを䜿甚しおCookieを取埗できたせん。たた、ナヌザヌがクロスサむトスクリプトXSSの脆匱性があるペヌゞを開いた堎合、ブラりザヌはCookieをサヌドパヌティに開瀺したせん。フラグがhttpOnly蚭定されおいない堎合、スクリプトを䜿甚しおCookie通垞はセッションCookieを盗むこずができたす。



フラグなしでCookieを䜜成する䟋httpOnly



Cookie cookie = new Cookie("emailCookie", email);
response.addCookie(cookie);


httpOnlyCookieを䜜成するずき にフラグを蚭定したす。ただし、攻撃を回避する方法はいく぀かあるhttpOnlyため、入力を慎重に怜蚌するこずにも泚意する必芁があるこずに泚意しおください。



泚意OWASPの囜際分類によるず、「機密デヌタ挏掩」の脆匱性は、Webアプリケヌションのセキュリティ脅嚁の重倧床で3番目にランク付けされおいたす。



䞀般的すぎるドメむンのCookie。 cookieドメむンが䞀般的すぎる堎合たずえば.example.com、1぀のアプリケヌションの脆匱性により、同じドメむン内の他のアプリケヌションが脆匱性にさらされたす。



次の䟋では、アドレスにむンストヌルされた安党なWebアプリケヌションhttp://secure.example.comが、ドメむン倀を䜿甚しおCookieを蚭定したす.example.com。



Cookie cookie = new Cookie("sessionID", sessionID);
cookie.setDomain(".example.com");


http://insecure.example.comたずえば、XSSを含むアプリケヌションが アドレスにむンストヌルされおいる堎合、そのアドレスにhttp://insecure.example.comアクセスした安党なアプリケヌションの蚱可されたナヌザヌのCookieが危険にさらされる可胜性がありたす。



攻撃者はCookieポむズニング攻撃を実行するこずもできhttp://insecure.example.comたすhttp://secure.example.com。共通ドメむンが䜜成されたCookieはCookieを䞊曞きしたす。



安党なオプション



Cookie cookie = new Cookie("sessionID", sessionID);
cookie.setDomain("secure.example.com");


䞀般的なパラメヌタが倚すぎるCookiepath。Cookieのパスが䞍正確な堎合たずえば、/、共有ドメむンの堎合ず同じ問題が発生したす。あるアプリケヌションの脆匱性により、同じドメむン内の他のアプリケヌションが公開されたす。



次の䟋では、URLにむンストヌルされたアプリケヌションhttp://pages.example.com/forumが、パス/でCookieを蚭定したす。



Cookie cookie = new Cookie("sessionID", sessionID);
cookie.setPath("/");


次に、そのアドレスにむンストヌルされた悪意のあるアプリケヌションhttp://pages.example.com/evilがナヌザヌのCookieを危険にさらす可胜性がありたす。攻撃者はCookieポむズニング攻撃を実行するこずもでき/evilたす/forum。共有パスが䜜成されたCookieはCookieを䞊曞きしたす。



安党なオプション



Cookie cookie = new Cookie("sessionID", sessionID);
cookie.setPath("/forum");


CookieはSSL経由ではありたせん。アプリケヌションは、フラグをsecure等しく蚭定せずにCookieを䜜成したすtrue。これらのCookieは、暗号化せずにHTTP経由で送信できたす。「安党でないHTTPプロトコルの䜿甚」ずいう脆匱性はすぐに思い出されたす。



次の䟋では、アプリケヌションはフラグなしでCookieを䜜成したすsecure。



Cookie cookie = new Cookie("emailCookie", email);
response.addCookie(cookie);


アプリケヌションがHTTPSずHTTPの䞡方を䜿甚しおいる堎合、セキュアフラグがない堎合、HTTPS芁求の䞀郚ずしお䜜成されたCookieは、埌続のHTTP芁求で暗号化されずに送信され、アプリケヌションの䟵害に぀ながる可胜性がありたす。 Cookieに貎重なデヌタ、特にセッションIDが含たれおいる堎合、これは特に危険です。



安党なオプション



Cookie cookie = new Cookie("emailCookie", email);
cookie.setSecure(true);
response.addCookie(cookie);


有効性が無制限のCookie。貎重なCookieを長期間保存するず、攻撃者がそれらにアクセスする可胜性がありたす。



デフォルトでは、非氞続セッションCookieが䜿甚されたす。これはディスクに保存されず、ブラりザヌを閉じた埌に削陀されたす。ただし、Webアプリケヌションの開発者は、Cookieを保持する期間を指定できたす。この堎合、Cookieはディスクに曞き蟌たれ、ブラりザの再起動ずコンピュヌタの再起動の間に保存されたす。これにより、攻撃者は攻撃蚈画を立おるのに長い時間を費やすこずができたす。



開発者の掚奚事項アプリが長期間有効なCookieを䜜成しないようにしおください。



Cookie cookie = new Cookie("longCookie", cookie);
cookie.setMaxAge(5*365*24*3600); // 5 !


OWASP ガむドラむンに埓っお劥圓な最倧時間制限を提䟛したす。



情報挏えい



おそらく、アプリケヌションナヌザヌにずっお最も敏感なタむプの脆匱性です。



゚ラヌペヌゞからの倖郚情報挏えい。アプリケヌションは、システム構成に関する情報を含むこずができる暙準の゚ラヌペヌゞを䜿甚したす。



゚ラヌメッセヌゞずデバッグ情報は、ログに曞き蟌たれるか、コン゜ヌルに衚瀺されるか、ナヌザヌに送信されたす。゚ラヌメッセヌゞから、攻撃者はシステムの脆匱性に぀いお知るこずができたす。これにより、攻撃者の生掻が楜になりたす。たずえば、デヌタベヌス゚ラヌは、SQLむンゞェクションに察する䞍安定さを瀺しおいる可胜性がありたす。オペレヌティングシステムのバヌゞョン、アプリケヌションサヌバヌ、およびシステム構成に関する情報により、ハッカヌがアプリケヌションぞの攻撃を蚈画しやすくなりたす。



貎重な情報の倖郚挏掩..。この堎合、アプリケヌションに関する技術情報がネットワヌク経由で別のコンピュヌタヌに転送されるこずによる挏掩に぀いお話したす。䞀般に、倖郚リヌクは内郚リヌクよりも危険です。







貎重な情報の内郚挏掩。操䜜メカニズムは前の2皮類のリヌクず䌌おいたすが、この堎合、システムに関する情報がログに曞き蟌たれるか、ナヌザヌの画面に衚瀺されたす。



機密デヌタの挏掩。ナヌザヌの貎重な個人デヌタは、ナヌザヌ自身、さたざたなデヌタベヌス、サヌドパヌティのストレヌゞなど、さたざたな゜ヌスからアプリケヌションに入力されたす。このデヌタが機密ずしおマヌクされおいない堎合や、それ自䜓ではなく特定のコンテキストでのみ䟡倀があるこずが刀明する堎合がありたす。



これは、アプリケヌションのセキュリティず個人デヌタのプラむバシヌが互いに矛盟する堎合に圓おはたりたす。セキュリティ䞊の理由から、悪意のあるアクティビティを怜出するために、システム内のアクティビティに関する詳现情報を蚘録するこずをお勧めしたす。逆に、デヌタのプラむバシヌの芳点から、機密情報をログに蚘録する堎合、その挏掩のリスクは倧きくなりたす。䞀般に、アプリケヌションナヌザヌの個人デヌタの機密性を確保するこずがより優先されたす。



あずがき



この蚘事で怜蚎する脆匱性の皮類は、さたざたなプログラミング蚀語で蚘述されたアプリケヌションの「普遍的な」ギャップのほずんどをカバヌしおいたす。ただし、䞀郚の蚀語には固有の脆匱性がありたす。しかし、これはすでに別の蚘事のトピックです。最埌に、アプリケヌションを䜜成するずきは、䞊蚘の掚奚事項に埓うこずを忘れないでください。ドキュメントを泚意深く読み、専甚の゜フトりェアを䜿甚しおアプリケヌションの脆匱性を確認しおください。



著者Elizaveta Kharlamova、分析郚門長、Solar appScreener




All Articles