パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

「UNLHA32.DLL」が7年ぶりにアップデート」記事へのコメント

  • by Anonymous Coward

    わざわざ Win32s に対応したとのこと、本当ご苦労様でございました・・・。

    正直なところ「任意のDLL読み込み」ってやつが何故、脆弱性になるのか
    さっぱり理解できない。
    Windowsがそういう仕様なんだから、そういうもんだって話で終わりでしょ。

    非システム管理外領域であろうと、悪意あるDLLをディスク保存された時点で
    すでに感染完了でアウト。
    kernel32.dll の偽DLLを実行DIR内に置くことで乗っ取りできるなら、それを阻止しても
    次は unlha なり何なりのアーカイバのDLL本体を直接置き換えられるだけでしょう。

    たとえは変だけど、家の

    • 非システム管理外領域であろうと、悪意あるDLLをディスク保存された時点ですでに感染完了でアウト。

      今時のブラウザの多くは、デフォルト設定で、Webサイトにアクセスしただけでユーザーの操作無しに任意のファイルをディスク上の "%USERPROFILE%\Downloads" に自動保存可能になっています(任意の DLL 読み込み問題による被害が多発したため、DLL は危険なファイルと判断してブロックするブラウザもありますが)。

      ディスクには悪意のあるファイルが保存されているのが前提条件であり、安全なファイルかどうかは ZoneID で識別して(つまりインターネットからダウンロードしたファイルは危険なファイルであるというフラグが付く)、

      • で、どうすりゃいいのよ。
        これが本当に脆弱性として取り扱われるべきならば、ことは自己解凍ファイルだけではなく
        「downloadフォルダで実行される可能性がある実行ファイル」全てに該当すると思うのだが。
        (つまりほとんどのEXE形式インストーラーと「インストール場所を選ばないアプリ」)
        http://micco.mars.jp/vul/2017/mhsvi20170515_01.htm [micco.mars.jp]
        の技術情報みても読み取れない。

        >・KERNEL32.DLLの遅延ロードを行うことは出来ない
        つーことはdownloadフォルダにKERNEL32.DLLという名前の悪

        • by Egtra (38265) on 2017年05月17日 22時32分 (#3212535)

          kernel32.dllそのものは、Known DLLsに登録されているので大丈夫です(user32.dllやgdi32.dllもです)。システム以外のディレクトリから同名のDLLが読み込まれることはありません。問題は、そこに書かれているように、Known DLLsのDLLがそうでないDLLを読み込むことなのです。

          使うAPIの全てを遅延ロードってとんでもなく面倒くさい。

          それこそVisual C++の遅延読み込みを使えば良いと思います。ソースコードの変更は不要なので、そこまで面倒ではないでしょう。そして、次のいずれかを実施すれば良いだろうかと思います(どなたか間違っていたら教えてください)。

          • プロセス起動後すぐにSetDefaultDllDirectriesを呼び出す。
          • 通知フック [microsoft.com]のdliNotePreLoadLibraryを使い、自分でDLLを読み込む(適切な実引数を指定してLoadLiraryExを実行する)
          • Windows 8以降であれば、プロセス起動後すぐにSetProcessMitigationPolicy [microsoft.com]でProcessImageLoadPolicyのPreferSystem32Images [microsoft.com]フラグを指定する。

          ただ、いずれの方法でも、そのURLの記事に書かれているWindows 7でのSSPICLI.DLLやWindows VistaのAPPHELP.DLLの場合まで対処するものではありませんので、その対策が別途必要です。

          その他 SSPICLI.DLLとかBCRYPT.DLLとか聞いたことのないようなDLL名が上がっているが,具体的にどうやったのか。どうやるべきなのか。

          これはProcess Monitorか何かで、実際に読み込まれるDLLを確認していったのではないかと思います。もちろん、各バージョンのWindowsごとに。ただ、そのURLの記事に書かれているIMEやウイルス対策ソフトなどが勝手にDLLを読み込んでくる問題を見落としがちという問題がありますが、どうしようもありません。

          親コメント
          • by Anonymous Coward

            >Known DLLsのDLLがそうでないDLLを読み込むこと
            えー?なんで?
            ふつうにwindows apiを使ってたらkernelやuserやgdiの関数を呼んでるもんだと思ってたら、全然違う場所から呼んでるってこと?

            Known DLLsから呼ばれる可能性のある「そうでないDLL」の一覧とかどっかにあるのか?

            >それこそVisual C++の遅延読み込みを使えば良いと思います。ソースコードの変更は不要
            なるほど。↓これですか。
            https://msdn.micro [microsoft.com]

            • by Egtra (38265) on 2017年05月19日 7時53分 (#3213297)

              >Known DLLsのDLLがそうでないDLLを読み込むこと
              えー?なんで?
              ふつうにwindows apiを使ってたらkernelやuserやgdiの関数を呼んでるもんだと思ってたら、全然違う場所から呼んでるってこと?

              UNLHA32.DLLの例のページの記述によれば、kernel32.dllは別のDLL(本当はSystem32に存在する想定)に対するインポートを有しているということだと考えています。

              #普段遣いのコンパイラはBorlandなのだが……
              #一応VC++もコンパイル確認だけはしているが。
              #あとmingw-JPとかlcc-win32とかWatcom C/C++とか…。

              そうなると起動用EXEと主たる処理のDLLに分割するのが比較的簡単ではないでしょうか。DLLでは、通常通りインポートできます。EXEのほうで対処してそのDLLを読み込む(SetDefaultDllDirectoriesまたはLoadLibraryExでLOAD_LIBRARY_SEARCH_SYSTEM32を指定するなど)という方法が可能です。このDLLに分ける処理、自己解凍書庫でこれを実装するのは一層大変そうですが。

              親コメント
            • by Anonymous Coward

              #Visual C++を普段遣いとしては使いたくない理由の一つに、それこそ公開用バイナリをそれで作ったらWin32sでは動かないとかそのへんもある。

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

処理中...