- 任意のデータを1つの絵文字にエンコードすることが可能
- Unicodeはテキストをコードポイントのシーケンスとして表現し、各コードポイントはUnicode Consortiumが意味を与えた数値。
- 単純なラテンアルファベットのテキストでは、Unicodeコードポイントと画面に表示される文字の間に1対1の対応が存在する。
- 他の文字体系では、画面に表示される文字が複数のコードポイントで表現されることがある。
- 異体字セレクタ
- Unicodeは「異体字セレクタ」と呼ばれる256個のコードポイントを定義しており、これらは単体では画面に表示されないが、直前の文字の表現を変更するために使われる。
- ほとんどのUnicode文字には異体字がなく、異体字セレクタは変換の過程でも保持される必要がある。
- 256個の異体字セレクタは、1バイトを隠す手段を提供する。
- データのエンコード
- 異体字セレクタのシーケンスを連結することで、任意のバイト列を表現できる。
- たとえば、
helloというテキストを表すデータ [0x68, 0x65, 0x6c, 0x6c, 0x6f] をエンコードできる。
- バイトを異体字セレクタに変換した後、それらをベース文字の後ろに連結してエンコードする。
- データのデコード
- デコードもエンコードと同様に単純。
- 異体字セレクタをバイトに変換することで、元のデータを復元できる。
- 悪用の可能性
- Unicodeの仕組みを悪用するものであるため、推奨されない。
- 人間向けのコンテンツフィルタを回避したり、テキストにウォーターマークを埋め込んだりするなど、悪意ある用途に使われる可能性がある。
- 結論
- 絵文字を使って任意のデータを隠す方法を説明しており、これはUnicodeの異体字セレクタを活用したもの。
- 面白い方法ではあるが、実際に使うには不適切かもしれない。
1件のコメント
Hacker Newsのコメント
UnicodeのPUA(Private Use Area)は内部およびカスタム用途で使われ、外部システムには渡されない
Unicodeの悪用は氷山の一角にすぎない
過去のペネトレーションテストの経験で、単純なダイアクリティカルマークだけでバックエンドWebサーバーのバッファをオーバーフローさせたことを覚えている
SanityはContent Source MapsをWebページの実際のテキストにエンコードするためにこの技術を使っている
LLM出力のウォーターマーキングにこの技術を使うというアイデアが気に入っている
StegCloakはAES-256-CTRで隠しペイロードを暗号化することで、このアイデアをさらに一歩進めている
LLM出力のウォーターマーキング以外にも、対数確率データをパッケージ化するのに使える
タイトルはやや誤解を招く
トークナイザーがこれを検出する
前職では複数の悪用事例のせいで、ユーザーのニックネームやステータスメッセージの「文字」を数えるためにコードポイントを使わなければならなかった
Unicodeタグ文字はASCIIを反映しており、UI要素ではしばしば見えない
MicrosoftがCopilotで修正した実際の悪用事例がある