- Windowsの文字変換機能「Best-Fit」に「重大な脆弱性」が発見されました。
- この脆弱性は、主に東アジアの言語設定を使用しているWindowsサーバー環境で外部入力からコマンドを注入される問題になります。
- ただし、一般ユーザーの Windows PCで日常的な使用をする分には影響は限定的です。
![Windowsの「Best-Fit」機能の脆弱性はパソコンに関係あるの?(自動文字変換の落とし穴)](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
以前から使っているフリーソフトなどがあれば、アップデートがないか確認しておきましょう。
また、インターネットでファイルをダウンロードするときには、特殊な記号を含むファイル名に特に注意しましょう。
YouTube動画でも話しています。
1. 「Windows上でのセキュリティの脆弱性」?
インターネットでニュースをみていたら、たまたま「Windows上でのセキュリティの脆弱性」についての情報がありました。
いくつかの意見を調べましたが専門用語が多く、プログラミングなどを組む技術者にとっての脅威なのか、それとも一般ユーザーにとっても脅威になるのかがわからず不安に思いました。
デザイン系の仕事をしていて 日常的に Windows PCは利用しているので、ソフトやデータのダウンロードの機会は比較的多いです。
今回の脆弱性について、なにか対策が必要なのでしょうか?
最近、Windowsの自動文字変換機能(Best-Fit)に「意図しない動作」の混入する処理が含まれている問題が改めて指摘されています1。
ただ、一般ユーザーの日常的な操作ではそこまで心配ありません。
メールを見たり、インターネットでニュースを読んだり、ワードで文章を書いたり、などはこれまで通りの使い方で大丈夫です。
今回の脆弱性について注意が必要だとすれば、以前から使っているソフトのアップデートがないか確認しておくことです。
また、変なサイトからダウンロードしたファイルを開いたりすることは避けましょう。特に、ファイル名に記号を含むものに注意が必要です。
![「Windows上でのセキュリティの脆弱性」?](https://chiilabo.com/wp-content/uploads/2021/08/sakurotu-ga-ru2.jpg)
Windows Updateの適用、不審なファイルを開かないなどの一般的なセキュリティ対策が十分有効なんだね。
それなのに、どうして「専門家」は大騒ぎしているの?
![「Windows上でのセキュリティの脆弱性」?](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
これは、自動車で言えば「一般ドライバー」と「整備士」の違いに似ています。
整備士の場合は、「最悪のケース」を想定します。
自分の車だけでなく多くの車両の安全に責任があり、小さな異常が重大事故につながる可能性を考えないといけないからです。
1-1. 文字変換処理でコードの意味が変わってしまう(「Best-Fit」機能)
脆弱性で実害が発生するのは、主にサーバー環境、特に日本語・中国語・韓国語のWindows環境で運用されているウェブサーバです。
このようなウェブサーバでは、リクエストの一部に含まれたUnicodeが原因でリモートコードが実行できてしまいます。
![WorstFit: Unveiling Hidden Transformers in Windows ANSI! | Orange Tsai](https://chiilabo.com/wp-content/uploads/2025/01/image-4-1024x578.png)
- 例えば、Windowsサーバ上のPythonコードで外部ファイルをダウンロードするときに、 wget.exe のパラメータ文字列に全角の二重引用符「U+FF02」が含まれている場合に問題が発生します。
- Windowsシステムにコマンドが渡され、wget.exeの内部でパラメータを解釈するときに、UnicodeからANSI文字列に自動変換されます。
この処理が「Best-Fit」機能なのですが、「余計なおせっかい」。 - 全角二重引用符(U+FF02)が通常の二重引用符(”)に変換されるため、コマンドラインのパラメータが意図せず3つに分割されてしまうのです。
これにより、コマンドに変なオプションが追加されてしまいます。
![文字変換処理でコードの意味が変わってしまう(「Best-Fit」機能)](https://chiilabo.com/wp-content/uploads/2021/08/sakurotu-ga-ru2.jpg)
雰囲気は「SQLインジェクション」と似ているね。
入力を受け取るときのチェックは大事で、コマンドラインで特別な意味がある “や¥などの文字は別の文字に変換しないといけないんだよね。
![文字変換処理でコードの意味が変わってしまう(「Best-Fit」機能)](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
ウェブサーバには外部からの入力を受け付ける処理があります。
この中に特殊な文字が含まれていると、文字列の区切りがおかしくなって、スクリプトの意味が変わってしまうのです。
処理におけるチェックの不備が「脆弱性」です。
「Best-Fit機能」は、UnicodeからANSI文字への変換時に、対応する文字が存在しない場合に「見た目が似ている」文字に置き換える機能です。
2. 一般ユーザーに関係はある?
一般ユーザーのパソコンの場合は、外部から直接入力を受け付けるようにはなっていません。
そのため、日常的に遭遇する可能性はかなり低いです。
もちろん、特定の条件下では問題が起こる可能性もあります。
影響があるとすれば、ダウンロードしたファイルの名前に特殊文字が含まれるようなケース。
これを古いアプリケーションで開こうとすると、内部処理にANSI APIがあって、コマンドライン引数や環境変数などが予期せぬ形にコマンドへと変質してしまう可能性があります。
この問題が関係するのは、ANSI API という古い機能をそのまま使っているソフトです。
一般ユーザーは、このような古いソフトの利用は避けた方がよいでしょう。
といっても、ここで動作するコマンドは管理者権限ではなく「標準ユーザー権限」です。
いきなりシステム全体に影響を与えるようなマルウェアがインストールされたりするわけではありません。
また、現在のWindows 10/11では UTF-8 対応が進んでいます。
そのため、影響範囲は限定的だと言えます。
![一般ユーザーに関係はある?](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
つまり、古いプログラムで変なファイル名のものを開く、という条件がそろってしまうと予期せぬ動作をさせられるリスクがある、というわけです。
2-1. サーバにとっては「危険な脆弱性」
ただし、Windowsサーバにとってはより深刻な問題です。
いくつもの攻撃パターンが想定されるためです。
- パストラバーサル攻撃(Path Traversal):
ファイルシステムの制限を迂回して意図しないディレクトリにアクセス - コマンドインジェクション攻撃(Argument Injection):
コマンドライン引数を改変して意図しない動作を引き起こす - 環境変数混乱攻撃(Environment Variable Confusion):
環境変数の解釈の違いを利用した攻撃
ちなみに、同種の問題は 2024年6月に、すでにPHPサーバの脆弱性としても指摘されていました2。
Apache ウェブサーバーの .htaccess ファイル に以下のようなコードを入れる方法が対策として示されていました。
RewriteEngine On
RewriteCond %{QUERY_STRING} ^%ad [NC]
RewriteRule .? - [F,L]
URLのクエリ文字列(?以降の部分)に %ad
で始まるパターン(特に危険な文字コードに対応)がないかチェックし、アクセスを拒否する設定です。
しかし、Windows の Best-Fit 問題の攻撃パターンは、クエリ文字列にとどまらないので、これだけでは不十分。
より包括的な対策が必要なことが明らかになったわけです。
Unicodeの入力を受け取って、内部処理でANSIを利用するときに問題が発生するので、重要なシステムでは、Unicode文字の使用を制限することも対策になります。
2-2. 古いソフトは改修する必要がある
ソフト開発者はソフトを古いANSI API を使っている場合、最新のUnicode APIを使ったり、入力値の厳密な整合性チェックを実施したりするように、アプリケーションを更新する必要があります。
しかし、ソフトを構成している部品を変更するのは「行うは難し」。
どこで新たな不整合の問題が発生するか予見するのはかなり困難だからです。
脆弱性の修正は単純ではなく、主要なベンダーでも対応が分かれています。
- Microsoftは一部の製品でのみ修正を実施
- Curlは「Windowsの機能の問題」として修正を見送り
- OpenSSLは環境変数による回避策を提供
- Perlは「Microsoftの問題」として未対応
完全な解決には、WindowsのUTF-8対応の完了を待つ必要があります。
現在のBeta機能でUTF-8を有効にすることで一定の緩和は可能ですが、別の部分で誤動作するような可能性も指摘されています。
![古いソフトは改修する必要がある](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
修正箇所が広範囲に根深く潜んでいるので、プログラムをメンテナンスする人たちにとっては「悪夢」なのです。
パストラバーサル攻撃とは、ファイルシステムの意図しないディレクトリへのアクセスを可能にする攻撃です。
Best-Fit変換により、パス区切り文字として解釈される文字(例:¥)が生成され、セキュリティチェックをバイパスする可能性があります。
3. 【補足】WindowsのANSI API
![【補足】WindowsのANSI API](https://chiilabo.com/wp-content/uploads/2021/08/sakurotu-ga-ru2.jpg)
どうして「ANSI API」という古い機能があるの?
![【補足】WindowsのANSI API](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
文字コードの話は厳密にすると複雑になるので、触りの部分を見ていきましょう。
WindowsでのANSI、Unicode、UTF-8の歴史的経緯と仕組みについて説明します。
3-1. ANSIは古い(〜1990年代前半)
「ANSI」は、Windows初期の頃に使用されていた、比較的古い文字コードの規格です。
現在の一般的なソフトウェアで使われることは減っています。
1990年代前半までが、ANSIの時代。
8ビット(1バイト:256種類)で文字を表現するために、コードページ方式の採用されていました。
この方法の問題点は、1つのシステムで1つのコードページしか扱えず、異なる言語間でのテキスト交換が困難だということです。
3-2. Unicode版APIの登場(AとW)
そこで、Windows NT/95以降は、Unicodeの時代になります。
内部的にUTF-16LEを基本エンコーディングとして使い、すべての文字を16ビット(2バイト)以上で表現するようになりました。
ただし、過去のプログラムが動作するようにANSI APIも維持されました(後方互換性)。
これが、Win32 APIの二重構造を作ります。
// ANSI版API (A suffix)
CreateFileA("filename.txt", ...);
// Unicode版API (W suffix)
CreateFileW(L"filename.txt", ...);
![Unicode版APIの登場(AとW)](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
C言語のコード上も従来のANSI文字列と L"〜"
と書くUnicode文字列が混在することになります。
![Unicode版APIの登場(AとW)](https://chiilabo.com/wp-content/uploads/2021/08/sakurotu-ga-ru2.jpg)
どっちでもできると、つい「普通の文字列(ANSI文字列)」を使いがちなんだよね。
本来、ANSIは “American National Standards Institute” (アメリカ国家規格協会) の略です。
しかし、Windowsでは、実際のANSIが定めた規格とは異なり、非Unicode文字コードを指す通称として「ANSI」という言葉が使われています。
3-3. WindowsでもUTF-8がサポートされる
Unicodeには、いくつか種類があります。
最近、Windows 10 バージョン1903以降になり、システム全体で UTF-8 を利用できるようになりました。
「UTF-8」は、1-4バイトの可変長エンコーディングが特徴で、インターネットとの親和性が高いです。
UTF-16LEがすべての文字を2バイト以上で表現するのに対して、
UTF-8は、英数字はそのまま1バイトで表現されるため、そのままASCIIコードを読み込めるからです。
![WindowsでもUTF-8がサポートされる](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
Windows のこのような文字列の扱いは、Unixサーバなどのコマンドやスクリプトとの互換性を高めるためですが、まだエラーの混入する余地があります。
![Windows 11 24H2でセキュリティ更新できなくなる「皮肉な不具合」](https://chiilabo.com/wp-content/uploads/2025/01/image-3-17-320x198.jpg)
![[Windows]IPv6に整数アンダーフローで不正コード実行の脆弱性があった(CVE-2024-38063)](https://chiilabo.com/wp-content/uploads/2024/08/image-9-20240817-083325-320x198.jpg)
![WindowsでもUTF-8がサポートされる](https://chiilabo.com/wp-content/uploads/2025/01/image-7-5-1024x576.jpg)
(補足)
- この脆弱性は2009年のBlack Hat USAカンファレンスで既に指摘されていました。当時からUnicodeへの移行期における単純な文字列のブラックリスト回避手法として認識されていました。 WorstFit: Unveiling Hidden Transformers in Windows ANSI! | Orange Tsai
- WindowsのPHPサーバに緊急の脆弱性、確認とアップデートを | TECH+(テックプラス)