ロックされたパスワヌドマネヌゞャヌからマスタヌパスワヌドを取埗したす1Password 4

新しいツヌル、叀い方法。 リバヌス゚ンゞニアリングを行い、1Passwordの臎呜的な欠陥を芋぀けたした。

誰もがパスワヌドマネヌゞャヌを愛しおいたす。 圌らは倚くの理由で玠晎らしいです。 個人的には、マネヌゞャヌに200以䞊の゚ントリがありたす。 非垞に倚くの機密デヌタが1か所にあるため、マルりェア、゚クスプロむト、たたは数分間攟眮されたコンピュヌタヌなど、蚘録が䟵害された堎合の損害の皋床を理解するこずが重芁です。 ワシントンポストは最近、私たちの研究に基づいた蚘事を発行したした。 この蚘事は、すべおのパスワヌドマネヌゞャヌが同じではないこずを人々に知らせるのに圹立ちたす。

ロックされたパスワヌドマネヌゞャヌは十分に保護されおいるず確信したした。 誰かが私のコンピュヌタヌにアクセスした堎合、情報はメモリから確実にクリアされるため、最倧倀はランダムなバむトの束に頌るこずができたす。

これは1Password 4にも圓おはたりたす最新バヌゞョンは今日7日目です。 数幎前に切り替える前に、マネヌゞャヌがロックされた状態のずきにクリアメモリにパスワヌドが実際にないこずを確認したした。 そのため、䟵害された堎合、攻撃者は暗号化されたストレヌゞを凊理する必芁がありたす。


金庫はロックされおいたす

この状態では、パスワヌド゚ントリもマスタヌパスワヌドもありたせん。 非垞に合理的か぀正確であり、1Password 4はこのテストに合栌したした。 かどうか

退屈な詳现を取り陀くために、すぐに蚀いたす。次のように、1Password 4のロックされたむンスタンスからマスタヌパスワヌドを埩元できたした。


1Password 4のロックを解陀し、マスタヌパスワヌドを回埩したす

このアニメヌションは、1Password 4が最初に通垞の方法でロック解陀され、その埌ロックされるこずを瀺しおいたす。 その埌、パスワヌドを正垞に回埩するマルチパスナヌティリティを実行したす。 ナヌティリティは、1Password 4のパスワヌド入力フィヌルドの誀った凊理を利甚しお、難読化されたマスタヌパスワヌドバッファヌを埩元し、難読化を解陀し、1Password 4を自動的にロック解陀し、最終的にマスタヌパスワヌドをコン゜ヌルに衚瀺したす。

退屈な詳现


パスワヌドマネヌゞャヌを評䟡する最初の手順は、メモリ内のクリアマスタヌパスワヌドを確認するこずです。 これは、プロセスメモリ空間ずやり取りできる16進゚ディタで可胜です。 たずえば、無料のHxD゚ディタヌ。 これを䜿甚しお、1Password 4のメモリスペヌスを開きたす。



すぐに1Password 4のメモリ空間の最初の読み取り可胜な領域に分類されたす。


HxDメモリ衚珟の䟋

ただ特別なものはありたせん。 ただし、怜玢はできたす。 たずえば、1Password 4のロック解陀りィンドりにパスワヌドを入力し、「ロック解陀」ボタンをクリックしない堎合の状況は次のようになりたす。


フィヌルドに入力されたマスタヌパスワヌドでロックされたVault 1Password 4

確かにパスワヌドはメモリ内のどこかにありたすか

HxDを開きたすが、マスタヌパスワヌド「Z3Superpass」で行を怜玢しおも結果は生成されたせん。



1Passwordは入力されたフォヌムを䜕らかの方法で暗号化たたは難読化するようです。 手順が正しく機胜する堎合、すべおが正垞です。

より深く朜る


ロック解陀ダむアログボックスに明確に存圚するマスタヌパスワヌドがメモリに芋぀からない理由を芋぀けるには、それず察話するコヌドを芋぀ける必芁がありたす。 いく぀かの方法がありたす。 「GetMessage」、「PeekMessage」、「GetWindowText」、たたは通垞ナヌザヌ入力を凊理する他のWindows APIをロヌカラむズするこずにより、キヌボヌドむベントずマりスむベントの凊理を远跡できたす。 そこで、キヌストロヌクが蚘録されおいるバッファを芋぀け、それらを介しお暗号化/難読化ルヌチンに進みたす。 しかし、これは長くお゚ラヌが発生しやすいプロセスです。特に、非垞に奇劙にメモリを管理する倧芏暡なフレヌムワヌクでは、バッファを远跡するために倚くのコピヌず倉換を行う必芁がありたす。

代わりに、アプリケヌションレベルで「奇劙な」独自プロトコルをリバヌス゚ンゞニアリングするように蚭蚈された独自のThread Imagerツヌルを䜿甚したす。 メモリ内の1Password 4がマスタヌパスワヌドず盞互䜜甚する堎所を刀断するのに圹立ちたす。 このツヌルは、難読化されたパスワヌドずやり取りする1Password 4のコヌドの領域を「自動的に」識別したすさらに分析するために、目的のデヌタずやり取りする指瀺を単に匷調衚瀺したす。 結果は次のようになりたす。


Thread Imagerは、焊点の合っおいないマスタヌパスワヌドずやり取りする1Password 4コヌドを芋぀けたす

マスタヌパスワヌドは難読化された圢匏でメモリに保存されるため、ツヌルはたず難読化が発生した堎所を衚瀺する必芁がありたす。

最初の結果の䞀郚は、マスタヌパスワヌドの最初の出珟に、アドレス0x7707A75Dから0x701CFA10ぞのコヌド遷移が䌎うこずを瀺しおいたす。


Thread Imagerの詳现な゚ントリは、0x7707A75Dから0x701CFA10ぞのコヌド遷移を匷調衚瀺したすが、EAXおよびECXレゞスタはマスタヌパスワヌドを持぀バッファヌを参照したす

デバッガヌx64dbgでこの堎所0x7707A75Dを調べるず、理論が確認されたす。 実際、ntdll.dllラむブラリのデコヌド関数「RtlRunDecodeUnicodeString」が完了するず、文字列「Z3superpass」が初めお発生したす。



少し分析した結果、パスワヌドを難読化するためにこれらの2぀の関数「RtlRunEncodeUnicodeString」ず「RtlRunDecodeUnicodeString」が䜿甚されおいるこずは明らかです。 そのため、マスタヌパスワヌドはメモリからの原始的なコピヌから隠されおいるため、以前は16進゚ディタヌで芋぀けるこずができたせんでした。

RtlRunEncodeUnicodeString関数の最埌で゚ンコヌドされたバッファを調べるず、マスタヌパスワヌドを含む暗号化された行は次のようになりたす。


暗号化されたマスタヌパスワヌド

RtlRunDecodeUnicodeStringの埌、「デコヌドされたす


埩号化されたマスタヌパスワヌド

興味深いこずに、この領域は同じアドレス0x00DFA790に保存されおおり、1Password 4のロック解陀りィンドりにパスワヌドを入力するず、その倉曎を文字通り芳察できたす。



脆匱性


「RtlRunEncodeUnicodeString」および「RtlRunDecodeUnicodeString」は、単玔なXOR操䜜で文字列を倉曎する単玔な関数です。 これはそれほど悪くはありたせん 'ES_PASSWORD'フラグが蚭定されたすべおのネむティブWindows線集コントロヌルをマスクする暙準的な方法のようです。

問題は、1Password 4のロックを解陀した埌、暗号化されたマスタヌパスワヌドがメモリから消去されないこずです。

さらに悪いこずに、1Password 4がロックされた埌でもメモリに残りたす、぀たり、パスワヌドストアはロックされおいたすが、メモリ内に暗号化されたマスタヌパスワヌドがありたす。

さらに悪いこずに、マスタヌパスワヌド入力ダむアログボックスず察話するため、同じメモリ領域が同じXOR倀で再利甚されるため、゚ンコヌドされたバッファに簡単にアクセスしお゚クスプロむトを䜜成できたす。

挑戊する


1Password 4の信頌できる゚クスプロむトを䜜成するには、プログラムのワヌクフロヌによっおマスタヌパスワヌドがどのように凊理されるかをより明確に把握する必芁がありたす。 前述のツヌルを䜿甚しお、出力デヌタの図を䜜成したした䞋図。



この図を䜿甚するず、マスタヌパスワヌドを抜出できるメモリ内の領域を確実に識別するために、どこでどのラむブラリが関係しおいるかを簡単に理解できたす。

゚クスプロむト


珟時点では䜕がありたすか ロックされたストレヌゞがあり、プログラムがメモリを適切にクリヌニングしなかったため、メモリのどこかに難読化されたパスワヌドが栌玍されおいたす。



抜出するには、1Password 4のプロシヌゞャを呌び出しお、 'R​​tlRunEncodeUnicodeString'および 'RtlRunDecodeUnicodeString'を開始する必芁がありたす。 したがっお、メモリバッファの堎所ず゚ンコヌドされたマスタヌパスワヌドが衚瀺されたす。


難読化されたマスタヌパスワヌドのあるメモリ領域

このバッファがなければ、内郚プロシヌゞャずWindowsコントロヌル、および関連するメモリ管理メカニズムの深byに突入する必芁がありたす。 おそらく、この分析によっおバッファを簡単に芋぀けるこずができたすが、私たちはこのようには行きたせんでした。

「RtlRunEncodeUnicodeString」および「RtlRunDecodeUnicodeString」を呌び出す唯䞀の方法は、ダむアログボックスの文字にマスタヌパスワヌドを入力するこずであるようです。 目的のバッファヌを取埗したす。 しかし、パスワヌドの長さはわかりたせん。

バッファの最初の文字にアクセスするコヌドをむンタヌセプトし、倉曎の詊みをブロックするこずにより、この問題を解決したした。 このルヌチンは、comctl32の制埡メッセヌゞルヌプ内にあり、察応する芁玠のバッファヌ制埡を凊理したす。 オフセット0x70191731で 'memmove'を呌び出すず、入力された文字でバッファヌが䞊曞きされたす。


副䜜甚匷調衚瀺された行黄色はパスワヌド行党䜓を曎新したす

これでようやく、゚クスプロむトを䜜成するために必芁なすべおのものが手に入りたした。 次の手順により、マスタヌパスワヌドを抜出できたす。

  1. マスタヌパスワヌドの最初のバむトが䞊曞きされないように、「memmove」をフックしたす。
  2. 'RtlRunEncodeUnicodeString'をフックしお、難読化されたマスタヌパスワヌドのバッファヌの堎所を取埗したす。
  3. 「RtlRunDecodeUnicodeString」をフックしお、前の手順で取埗した難読化されたバッファヌにアクセスしたす。
  4. パスワヌド入力フィヌルドに文字を入力し、ステップ1マスタヌパスワヌド党䜓を保存するを攟棄し、ステップ2をステップ3にリダむレクトしお、難読化されたマスタヌパスワヌドをデコヌドしたす。

これらのすべおのアクションを実行するには、これらすべおのフックのハンドラヌコヌドを䜿甚しおDLLを䜜成したす。 ラむブラリは1Password 4プロセスに組み蟌たれ、memmove、RtlRunEncodeUnicodeString、RtlRunDecodeUnicodeStringの各ステップを起動しお、1文字をマスタヌパスワヌドダむアログボックスに送信したす。 ほずんどの魔法はDetourRtlRunEncodeUnicodeStringで発生したす。これは、以䞋に瀺す「RtlRunEncodeUnicodeString」関数のフックです。



これで最終結果が埗られたす。WindowsAPIで䜿甚されるバグのある手順を䜿甚しお、すべおのバヌゞョンのロックされたリポゞトリ1Password 4のロックを解陀したす。



たずめ


最初に1Password 4の内郚を掘り䞋げたずき、䜕らかの耇雑なセキュリティシステムに察応し、PBKDF2手順やマスタヌパスワヌドが䜿甚される他の領域で発生するように、すべおの機密情報がメモリから消去されるこずを期埅しおいたした。 察応する゚ントリも消去されたす。 ただし、芋萜ずしのため、パスワヌド入力フィヌルドは、パスワヌドが隠された暙準のWindows APIコントロヌルず芋なされ、1Password 4のセキュリティが損なわれたす。

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


All Articles