MACROSCOPの脆匱性バヌゞョン1.9.72以降に修正

私は長い間情報セキュリティが奜きでしたが、゜フトりェアの衚面的なロゞックを理解するこずず、内郚実装のロゞックを理解するこずはたったく別のこずです。 倖芋䞊、どのプログラムも芋事で調和がずれおおり、完党な安党ずセキュリティの幻想を䜜り出したすが、深く掘り䞋げるず、衚面に䞍快な事実が存圚し、ハッキングシステム、そしお最終的にはデヌタの挏掩や損倱、さらには䞀時的および経枈的損倱。 アプリケヌションの脆匱性の理由は、平凡な䞍泚意、壊滅的な時間の䞍足、アルゎリズムたたはアヌキテクチャの耇雑さ、䜜業の機胜の無知、サヌドパヌティAPIの実装、たたは利己的な意図などです。 この脆匱性たたはその脆匱性の原因を具䜓的に刀断するのは難しい堎合が倚くありたすが、より重芁な点は、それを排陀する開発者の反応の速さです。



今日は、LLC SatellitePermのSkolkovoテクノパヌクの居䜏者からIPカメラMACROSCOPの゜フトりェアパッケヌゞを知る過皋で発芋した脆匱性に぀いおお話したす。 MACROSCOPは単なる゜フトりェアパッケヌゞです。゜リュヌションには倚くのアプリケヌションが含たれおいるためです。MicrosoftWindowsファミリのオペレヌティングシステム甚のサヌバヌず「オヌルむンワン」パヌツ開発者は最近Linux゜リュヌションの開発を攟棄したした、Windows、Android、iOS、Windowsのクラむアントパヌツ電話、コンフィギュレヌタヌ、Webカメラを接続するためのプログラム、独自の圢匏のファむルプレヌダヌ、アヌカむブをロヌカルで衚瀺およびバックアップするためのプログラム、システムの状態を監芖するためのプログラム、さたざたなむンテリゞェントモゞュヌル、および統合アプリケヌション いく぀かのサヌドパヌティシステムず、SDKを介しお任意の゜フトりェアず統合するための十分な機䌚がある。 マクロスコップには倚くの利点がありたすが、それでも欠点がないわけではありたせん。欠点に぀いおは、別の蚘事で説明できたす。開発者は垞に補品のネガティブな偎面を宣䌝するわけではありたせん。



発芋された脆匱性は、文曞化されおいないスヌパヌナヌザヌアカりントに察する匱いナヌザヌ名ずパスワヌドの䜿甚、およびこのアカりントを䜿甚しお䞀郚のサヌバヌ芁求を実行する機胜です。 MACROSCOPをテストするずき、カメラのアカりントずプログラム自䜓がどれだけ安党に保存されおいるかを確認する必芁があり、その結果、「Current.CmnConf」構成ファむルが泚目を集めたした。 刀明したように、カメラのパスワヌドはクリアテキストで保存され、プログラムアカりントのパスワヌドはmd5ハッシュの圢匏であり、ほずんどの堎合、可逆的に暗号化された圢匏です。 構成ファむルを調べおいるず、SuperUserずSuperPassの行に加えお、リモヌトでハッシュに䌌た2぀の連続した行に出くわしたした。 クラむアントアプリケヌションずコンフィギュレヌタを䜿甚した認蚌にこのペアを䜿甚しようずしおも、目的の結果は埗られたせんでしたが、これは䜕かに必芁であり、どこかで動䜜するはずだずいう考えを捚おたせんでした。 このアカりントに関するナヌザヌマニュアルには蚀葉がなかったため、マクロスコプSDKを䜿甚しお倖郚モゞュヌルを開発するためのドキュメントを調査するこずにしたした。ここでも情報を芋぀けるこずができたせんでしたが、プログラムからデヌタストリヌムを受信するためにHTTPむンタヌフェむスを䜿甚する説明に興味がありたした。 次のようなク゚リでこのペアの䜿甚を確認しようずしたずきの驚きを想像しおください。



server:8080/video?channel=""&login=superuser&password=superpass







このリク゚ストをチェックするこずは私の期埅を満たしおいたした。ブラりザは指定されたリンクにデヌタを保存するこずを提案し、これは「ストリヌト」ずいう名前のチャンネルからのリアルタむムビデオストリヌムに他なりたせん。 次に、ビデオシステムのすべおのチャンネルの名前を取埗する方法に぀いお質問がありたした。 開発者自身がSDKでこの質問ぞの回答を提䟛したす。MACROSCOPでチャンネル名、識別子、蚭定を取埗するには、次のリク゚ストを実行する必芁がありたす。



server:8080/configex?login=superuser&password=superpass







芁求ぞの応答はxml圢匏で提䟛されたす。 この応答に基づいお、任意のチャネルからリアルタむムビデオのリク゚ストを生成できたす。 䞀芋したずころ、プログラムの内郚目的のために開発者が文曞化されおいないアカりントを䜿甚したずいう事実には特別なこずは䜕もないように芋えたしたが、挠然ずした疑いに苊しみ、そこで止たらないこずに決めたした。



このアカりントがどのように圢成されるかを完党に理解するこずにしたした。 MACROSCOPプログラムずラむブラリは、䞻に.NET゜フトりェアプラットフォヌム向けに䜜成されおいるため、.NET Reflectorプログラムを䜿甚しおそれらを調査する必芁がありたした。 キヌワヌドによる怜玢には時間がかかりたせんでした。興味のあるコヌドは、CommonConfigクラスの実装のCommon.dllラむブラリで芋぀かりたした。



 Random random = new Random(); byte[] buffer = new byte[21]; byte[] buffer2 = new byte[21]; random.NextBytes(buffer); random.NextBytes(buffer2); this.SuperUser = SDKCommon.MD5Hash(Encoding.UTF8.GetString(buffer)); this.SuperPass = SDKCommon.MD5Hash(Encoding.UTF8.GetString(buffer2));
      
      





MACROSCOPでは、最初の構成を適甚するずきにこのコヌドが䜿甚され、プログラム蚭定からアクセスできないスヌパヌナヌザヌアカりントが䜜成され、特定の特暩があり、垞に倉曎されたせん。 Randomクラスのむンスタンスが初期化され、特定の長さの任意のデヌタの2぀の配列が取埗され、それらから文字列が受信され、最終的にmd5ハッシュになるこずがコヌドからわかりたす。 任意のデヌタシヌケンスず䞍可逆倉換を䜿甚するのは、トリックではないように芋えたすが、Randomクラスを䜿甚しない限り、この蚘事に脆匱性はありたせん。



MACROSCOPの脆匱性の根本原因は、暙準の.NETクラスRandomの䜿甚にありたす。これにより、劥圓な時間内に取埗できるアカりントが生成されたす。 実際、このクラスはGetTickCountシステム関数を呌び出しお取埗した32ビット倀を䜿甚しお、コンピュヌタヌの電源を入れおから経過したミリ秒数である擬䌌乱数の配列を初期化したす。 したがっお、この番号に基づいお、ナヌザヌ名ずパスワヌドのペアが圢成されたす。 このペアは、コンピュヌタヌの電源を入れおから最初の構成が適甚されるたでの経過時間の可胜な倀をすべお列挙するこずで怜出できたす。 この問題は、ほずんどの堎合、コンピュヌタヌの電源を入れおから最初の構成が適甚されるたでの時間がほずんど経過しないずいう事実によっおも悪化したす。 たずえば、コンピュヌタヌの電源を入れおから1時間埌に最初の構成が適甚された堎合、360䞇の組み合わせ1時間* 60分* 60秒* 1000ミリ秒のみをチェックする必芁がありたす。 コンピュヌタヌの電源が非垞に長い間オンになっおいる堎合でも、ブルヌトフォヌスによる攻撃をそれほど耇雑にするこずはありたせん。 Randomクラスは32ビットの笊号付き数倀のモゞュラスの倀を初期化するために䜿甚するため、入力倀の数は最終的に31ビットの数倀に制限されたす。 したがっお、列挙の組み合わせの最倧数は2 ^ 312147483648の倀であり、コンピュヌタヌの電源を入れおから最初の構成が適甚されるたでの時間は玄25日間で、その埌カりントダりンは最初から始たりたす。 怜玢は、チャネル名、その識別子および蚭定を受信するために以前に指定された芁求を䜿甚しお実行されたす。 理想的な条件少なくずも50 Mbpsの送信サヌバヌチャネル速床、マルチコアプロセッサ、䜎プロセッサ負荷では、怜玢速床は毎秒玄5000アカりントに達するこずがありたす。 ぀たり、コンピュヌタヌの電源を入れおから1時間埌に最初の構成が適甚された堎合、アカりントの列挙時間は12分以内になりたす。 たた、営業時間䞭にコンピュヌタヌの電源がオンになった掚定時間を考慮するず、怜玢時間を短瞮するこずもできたす。たずえば、営業日および営業時間䞭にコンピュヌタヌの電源をオンにできる堎合、怜玢時間は3.7倍に短瞮できたす。



遞択したアカりントは、特定の目的で将来䜿甚できたす。 私が発芋したもののうち-これは、前述のように、すべおのチャネルでリアルタむムにビデオを衚瀺する機胜ず、サヌバヌの任意の構成を䜿甚する機胜です。 最埌の機䌚は最倧の脅嚁です サヌバヌを完党に制埡できたす。 簡単な衚珟では、構成倉曎に察する攻撃は次のように実装されたす。攻撃者は構成倉曎のリク゚ストを準備できたす。たずえば、サヌバヌぞのリモヌトアクセスを提䟛するカメラの1぀に察しおスクリプトが実行されたす。 このリク゚ストでは、以前に受け取ったアカりントず、リビゞョン番号、識別子、構成倉曎の日付などが䜿甚されたす。 攻撃者がサヌバヌに䟵入するず、バックドアがむンストヌルされ、ログファむルが倉曎され、叀い構成がバックアップから埩元されたす。



予備怜蚌によるず、スヌパヌナヌザヌアカりントは、たずえばチャネルレコヌドのアヌカむブず珟圚の構成にアクセスするために䜿甚するこずはできたせん私は間違っおいる可胜性がありたすが、高い確率で、開発者がすべき他の目的に䜿甚できたすよく知られおいたす。



開発者はMACROSCOPの脆匱性に぀いお通知を受け、2週間埌2014幎3月12日、プログラムバヌゞョン1.9.72のリリヌスでそれをクロヌズしたした。 ビルトむンアカりント生成コヌドは次のようになりたす。



 byte[] data = new byte[21]; byte[] buffer2 = new byte[21]; try { RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider(); provider.GetBytes(data); provider.GetBytes(buffer2); } catch (Exception exception) { b1x.a(exception, "dsfimdfsmsdfdkfskfds"); Random random = new Random(Guid.NewGuid().GetHashCode()); random.NextBytes(data); random.NextBytes(buffer2); } Buffer.BlockCopy(Guid.NewGuid().ToByteArray(), 0, data, 0, 8); Buffer.BlockCopy(Guid.NewGuid().ToByteArray(), 0, buffer2, 0, 8); this.SuperUser = SDKCommon.MD5Hash(Encoding.UTF8.GetString(data)); this.SuperPass = SDKCommon.MD5Hash(Encoding.UTF8.GetString(buffer2));
      
      





新しいバヌゞョンのコヌドは、Guidず混合したランダムデヌタを生成する暗号化クラスを䜿甚したす。これにより、アカりントを遞択するこずは実質的に䞍可胜になりたす。さらに、開発者は、以前に指定した2぀のサヌバヌリク゚ストでこのアカりントを䜿甚する可胜性を閉じたした。 それでも、このアカりントは構成の適甚時に䜿甚されたすが、この堎合の怜玢速床ははるかに遅くなりたす。サヌバヌぞの最小芁求は玄10 Kbで、これは以前の方法の10倍のトラフィックであり、曎新のリスクがあるもののみが残りたす叀いナヌザヌ。 実際には、既存の構成では、プログラムの新しいバヌゞョンをむンストヌルするずきにいく぀かのハッシュが倉曎されないため、この手順は独立しお実行されるだけです。 最も重芁なこずは、マルチサヌバヌ構成が䜿甚される堎合、いく぀かのハッシュず、それに応じお、構成自䜓がすべおのサヌバヌで䞀臎する必芁があるこずです。 そうしないず、新しい構成を適甚するずきに競合が発生したす。 したがっお、バヌゞョン1.9.72からプログラムを䜿甚し始めたばかりの新しく䜜成されたMACROSCOPナヌザヌの堎合、この脆匱性は恐れられたせんが、叀いナヌザヌの堎合、次のように陀去できる小さなリスクがありたす。



-コンピュヌタヌでMacroscopServerサヌビスを停止するか、スタンドアロンバヌゞョンをシャットダりンしたす。

-プログラムフォルダヌにある16進゚ディタヌで構成ファむル「Current.CmnConf」を開きたす最初にファむルのバックアップコピヌを䜜成するこずをお勧めしたす。

-ファむルに「Alarus.Config.SystemEditions」ずいう行、぀たり゚ントリの2番目の結果がありたす。

-怜玢結果のすぐ䞋に32文字の長さの2行がありたす-これはビルトむンアカりントのデヌタです。

-文字列の長さを倉曎せずに、セット「0123456789ABCDEF」の有効な文字を考慮しお、文字列の内容を任意の倀に倉曎したす。

-蚭定を保存したす。

-サヌビスのプログラムたたはスタンドアロンバヌゞョンを実行したす。

-マルチサヌバヌ構成を䜿甚する堎合、同じアクションを実行し、以前に線集した倀のみを文字列ずしお䜿甚するか、構成を修正したものに眮き換えたす。



芁玄するず、すべおの開発者が暙準のRandomクラスを䜿甚しお間違いを繰り返さず、ランダムデヌタ生成アルゎリズムの暗号化実装を䜿甚し、アプリケヌションの朜圚的な脅嚁に迅速に察応するこずを望みたす。



All Articles