コンピューティングにおいて、ポリグロットとは、複数のプログラミング言語またはファイル形式の有効な形式で記述されたコンピュータプログラムまたはスクリプト(またはその他のファイル)です。[1]この名前は、多言語主義との類似性から生まれました。ポリグロットファイルは、 2つ以上の異なる形式の構文を組み合わせて構成されます。[2]
ファイル形式がソースコードとしてコンパイルまたは解釈される場合、そのファイルはポリグロットプログラムであると言えますが、ファイル形式とソースコードの構文はどちらも基本的にはバイトのストリームであり、この共通性を活用することがポリグロットの開発の鍵となります。[3]ポリグロットファイルは互換性の点で実用的な用途がありますが、[4]検証をバイパスしたり脆弱性を悪用したりするために使用されると、セキュリティ上のリスクが生じることもあります。
歴史
ポリグロットプログラムは、少なくとも1990年代初頭からハッカー文化における挑戦や珍品として作られてきました。注目すべき初期の例は、1991年にUsenetpolyglotグループrec.puzzlesで公開されたもので、8つの言語をサポートしていますが、これはさらに古いプログラムからインスピレーションを得ています。[5] 2000年には、ポリグロットプログラムがInternational Obfuscated C Code Contestで優勝しました。[6]
21世紀には、ポリグロットプログラムとファイルはマルウェアの拡散のための隠れチャネルメカニズムとして注目を集めました。[3] [7]ポリグロットファイルは互換性において実用的な用途があります。[8]
工事
ポリグロットは、2 つ以上の異なる形式の構文を組み合わせて作成され、形式間で共通するさまざまな構文構造、または言語固有だが各言語で異なる意味を持つ構造を活用します。ファイルは、複数の解釈プログラムによって正常に解釈できる場合、有効なポリグロットです。たとえば、PDF-Zip ポリグロットは、有効な PDF ドキュメントとして開くことも、有効なzipアーカイブとして解凍することもできます。解釈プログラム間で有効性を維持するには、1 つの解釈プログラムに固有の構造が別の解釈プログラムによって解釈されないようにする必要があります。その逆も同様です。これは、多くの場合、他の形式のコメントまたはプレーンテキストとして解釈されるセグメント内の言語固有の構造を隠すことによって実現されます。[1]
例
C、PHP、Bash など
ポリグロット プログラムを構築するためによく使用される 2 つの手法は、コメントに異なる文字を使用する言語を利用することと、さまざまなトークンを異なる言語で別のトークンとして再定義することです。これらは、 ANSI C、PHP、bashで記述されたこのパブリック ドメインのポリグロットで実証されています。
Bash のハイライト
#define a /*
#<?php echo "\010Hello, world!\n" ; // 2 > /dev/null > /dev/null \ ; // 2 > /dev/null ; x = a ; $x = 5 ; // 2 > /dev/null \ ; if (( $x )) // 2 > /dev/null ; then return 0 ; // 2 > /dev/null ; fi #define e ?> #define b */ #include <stdio.h> #define main() int main(void) #define printf printf( #define true ) #define function function main () { printf "Hello, world!\n" true/* 2 > /dev/null | grep -v true*/ ; return 0 ; } #define c /* main
#*/
PHPのハイライト
#define a /*
# <?php
echo " \010 Hello, world! \n " ; // 2> /dev/null > /dev/null \ ;
// 2> /dev/null; x=a;
$x = 5 ; // 2> /dev/null \ ;
if (( $x ))
// 2> /dev/null; then
return 0 ;
// 2> /dev/null; fi
#define e ?>
#define b */
#include <stdio.h>
#define main() int main(void)
#define printf printf(
#define true )
#define function
function main ()
{
printf "Hello, world! \n " true /* 2> /dev/null | grep -v true*/ ;
return 0 ;
}
#define c /*
main
#*/
Cのハイライト
#define a /*
#<?php
echo "\010Hello, world!\n";// 2> /dev/null > /dev/null \ ;
// 2> /dev/null; x=a;
$x=5; // 2> /dev/null \ ;
if (($x))
// 2> /dev/null; then
return 0;
// 2> /dev/null; fi
#define e ?>
#define b */
#include <stdio.h> #define main() int main(void) #define printf printf( #define true ) #define function function main () { printf "Hello, world! \n " true /* 2> /dev/null | grep -v true*/ ; return 0 ; } #define c /* main #*/
次の点に注意してください。
- ハッシュ記号はC ではプリプロセッサステートメントを示しますが、bash と PHP の両方ではコメントになります。
- 「//」は PHP と C の両方でコメントであり、 bash ではルート ディレクトリです。
- シェルのリダイレクトは、望ましくない出力を排除するために使用されます。
- コメントアウトされた行でも、PHP インジケーターの "
<?php" および "?>" は有効です。 - ステートメント "
function main()" は PHP と bash の両方で有効です。C #define はint main(void)コンパイル時にこれを " " に変換するために使用されます。 - コメントインジケーターを組み合わせてさまざまな操作を実行できます。
- 「
if (($x))」は、bash と PHP の両方で有効なステートメントです。 printfは bashシェルの組み込み関数で、括弧が省略されていることを除いてC の printfと同じです(括弧はC コンパイラでコンパイルされた場合にC プリプロセッサによって追加されます)。- 最後の 3 行は、
main関数を呼び出すために bash によってのみ使用されます。PHP ではmain関数は定義されますが呼び出されず、C では関数を明示的に呼び出す必要はありませんmain。
SNOBOL4、Win32Forth、PureBasicv4.x、および REBOL
以下は、SNOBOL 4、Win32Forth、PureBasicv 4.x、およびREBOLで同時に記述されています。
SNOBOLのハイライト
* BUFFER : AA ; .( Hello, world !) @ To Including?
Macro SkipThis ; OUTPUT = Char ( 10 ) "Hello, World !"
; OneKeyInput Input ( 'Char' , 1 , '[-f2-q1]' ) ; Char
End ; SNOBOL4 + PureBASIC + Win32Forth + REBOL = < 3
EndMacro : OpenConsole() : PrintN("Hello, world !")
Repeat : Until Inkey() : Macro S omeDummyMacroHere
REBOL [ Title : "'Hello, World !' in 4 languages"
CopyLeft : "Developed in 2010 by S ociety" ] Print
"Hello, world !" EndMacro : func [][] set-modes
system / ports / input [ binary : true] Input set-modes
system / ports / input [ binary : false] NOP:: EndMacro
; 新しい言語で改良したいです か?続けてください!
Forthのハイライト
*BUFFER : AA ; . ( Hello, world !) @ To Including? Macro SkipThis; OUTPUT = Char(10) "Hello, World !" ;OneKeyInput Input('Char', 1 , '[-f2-q1]') ; Char End; SNOBOL4 + PureBASIC + Win32Forth + REBOL = <3 EndMacro: OpenConsole() : PrintN("Hello, world !") Repeat : Until Inkey() : Macro SomeDummyMacroHere REBOL [ Title: "'Hello, World !' in 4 languages" CopyLeft: "Developed in 2010 by Society" ] Print "Hello, world !" EndMacro: func [][] set-modes system/ports/input [binary: true] Input set-modes system/ports/input [binary: false] NOP:: EndMacro ;新しい言語で改良したいですか?続けてください!
BASICのハイライト
* BUFFER : A . A ; . ( Hello , world ! ) @ To Including ? Macro SkipThis ; OUTPUT = Char ( 10 ) "Hello, World !" ; OneKeyInput Input ( 'Char', 1, '[-f2-q1]' ); Char End ; SNOBOL4 + PureBASIC + Win32Forth + REBOL = < 3 EndMacro: OpenConsole ( ) : PrintN ( "Hello, world !" ) Repeat : Until Inkey ( ) : Macro SomeDummyMacroHere REBOL [ Title: "'Hello, World !' in 4 languages" CopyLeft: "Developed in 2010 by Society" ] Print "Hello, world !" EndMacro: func [][] set - mode system / ports / input [ binary: true ] Input set - mode system / ports / input [ binary: false ] NOP: : EndMacro ;新しい言語で改良したいですか?続けてください!
REBOLのハイライト
*BUFFER : AA ; .( Hello, world !) @ To Including?
Macro SkipThis; OUTPUT = Char ( 10 ) "Hello, World !"
;OneKeyInput Input('Char', 1, '[-f2-q1]') ; Char
End; SNOBOL4 + PureBASIC + Win32Forth + REBOL = <3
EndMacro: OpenConsole () : PrintN ( "Hello, world !" )
Repeat : Until Inkey () : Macro SomeDummyMacroHere
REBOL [ Title: "'Hello, World !' in 4 languages"
CopyLeft: "Developed in 2010 by Society" ] Print
"Hello, world !" EndMacro: func [][] set-modes
system /ports/input [ binary: true ] Input set-modes
system /ports/input [ binary: false ] NOP:: EndMacro
; 新しい言語で改良したいですか? 続けてください!
DOS バッチファイルと Perl
次のファイルはDOSバッチ ファイルとして実行され、その後Perlで再実行されます。
DOSバッチで強調表示
@ rem = ' --PERL--
@ echo off
perl " %~dpnx0 " %*
goto endofperl
@ rem ';
#!パール「Hello, world!\n」
と印刷します。
__終わり__
:エンドオブパール
Perl のハイライト
@rem = ' --PERL-- @echo off perl "%~dpnx0" %* goto endofperl @rem ' ; #!perl print "Hello, world!\n" ; __END__ :endofperl
これにより、最小限の労力で DOS システムで実行できる Perl スクリプトを作成できます。異なるインタープリタでファイルがまったく同じ機能を実行する必要はないことに注意してください。
種類
ポリグロットの種類には以下のものがある: [3]
- スタック、複数のファイルが連結されている場所
- プライマリファイル形式のコメント欄内にセカンダリファイル形式が隠されている寄生虫
- 2つのファイルが互いのコメント内に相互に配置されるジッパー
- 空洞では、セカンダリ ファイル形式がプライマリ ファイルの null で埋められた領域内に隠されます。
利点
多言語マークアップ
ポリグロットマークアップは、HTML5とXHTMLの利点を組み合わせた便利なものとして提案されています。[9]このような文書は、 HTML ( SGML互換) としてもXMLとしても解析でき、どちらの方法でも同じDOM構造が生成されます。たとえば、HTML5文書がこれらの基準を満たすためには、 HTML5 doctypeを持ち、整形式の XHTML で記述されているという 2 つの要件があります。同じ文書を、ブラウザのサポートと MIME タイプに応じて、 HTML または XHTML として提供できます。
html-polyglot勧告[9]で述べられているように、ポリグロットHTML5文書を書くには、以下の重要な点に注意する必要があります。
- 処理命令とXML宣言はどちらもポリグロットマークアップでは禁止されています
- 文書の文字エンコーディングを指定する
- DOCTYPEは
- 名前空間
- 要素の構文 (つまり、終了タグはオプションではありません。空要素には自己終了タグを使用します。)
- 要素の内容
- テキスト(つまり、pre と textarea は改行文字で始まってはいけません)
- 属性(つまり、値は引用符で囲む必要があります)
- 名前付きエンティティ参照 (つまり、amp、lt、gt、apos、quot のみ)
- コメント (つまり、<!-- 構文 --> を使用)
- スクリプトとスタイル設定の多言語マークアップ
したがって、最も基本的なポリグロットマークアップ文書は次のようになります。[9]
<!DOCTYPE html>
< html xmlns = "http://www.w3.org/1999/xhtml" lang = "" xml:lang = "" >
< head >
< title >タイトル要素は空にできません。</ title >
</ head >
< body >
</ body >
</ html >
ポリグロットマークアップ文書では、非空要素(script、p、などdiv)は、たとえ空であっても自己閉じにすることはできません。これは有効なHTMLではないためです。[10]たとえば、ページに空のテキストエリアを追加するには、 を使用できず<textarea/>、代わりに を使用する必要があります<textarea></textarea>。
フォーマットの作成
DICOM医療画像フォーマットは、TIFFファイルとのポリグロットを可能にするように設計されており、DICOMまたはTIFFビューアのいずれかで解釈できるファイルに同じ画像データを効率的に保存することができます。[11]
互換性
Python 2とPython 3のプログラミング言語は互いに互換性を持つように設計されていませんが、構文の共通性は十分にあるため、両方のバージョンで実行できる多言語Pythonプログラムを書くことができます。[12]
セキュリティへの影響
2 つの形式をポリグロットすると、コメント フィールドに任意のデータを許可する JPEG ファイルなど、一見無害で広く受け入れられているラッパー形式内に、ステガノグラフィ的に悪意のあるペイロードが作成されることがあります。脆弱な JPEG レンダラーは、ペイロードを実行するように強制され、攻撃者に制御が渡される可能性があります。解釈プログラムが期待するものと、ファイルに実際に含まれている内容の不一致が、脆弱性の根本的な原因です。[1]
SQL インジェクションはポリグロットの単純な形式であり、サーバーはユーザーが制御する入力が特定の制約に準拠することを単純に期待しますが、ユーザーは SQL コードとして解釈される構文を提供します。
セキュリティのコンテキストでは、ポリグロット ファイルが複数の形式で厳密に有効である必要はないことに注意してください。ファイルがプライマリ インタープリタによって解釈されるときに、意図しない動作がトリガーされれば十分です。
柔軟性や拡張性に優れたファイル形式は、ポリグロット化の適用範囲が広く、そのため解釈を厳しく制限することで、ポリグロット技術を使用した攻撃に対するある程度の緩和策が講じられます。たとえば、PDF ファイル形式では、マジック ナンバーが %PDFバイト オフセット 0 に出現する必要がありますが、多くの PDF インタープリタはこの制約を放棄し、文字列が最初の 1024 バイト内に出現する限り、ファイルを有効な PDF として受け入れます。これにより、ポリグロット PDF ファイルがファイルのヘッダーに PDF 以外のコンテンツを密かに持ち込む機会が生まれます。[3] PDF 形式は「多様で曖昧」と表現されており、異なる PDF 解析エンジン間で動作が大きく異なるため、2 つの異なる PDF リーダーでまったく異なる 2 つの文書としてレンダリングされる PDF-PDF ポリグロットを作成することができます。[13]
ポリグロットファイル内に隠されたマルウェアを検出するには、ファイルなどのファイルタイプ識別ユーティリティに頼るよりも高度な分析が必要です。2019年に、市販のマルウェア対策ソフトウェアを評価したところ、いくつかのそのようなパッケージでは、テスト中のポリグロットマルウェアを検出できないことが判明しました。[3] [2]
2019年、DICOM医療画像ファイル形式は、PE -DICOMポリグロット技術を使用したマルウェア注入に対して脆弱であることが判明しました。[14]攻撃のポリグロットの性質と規制上の考慮事項が組み合わさって、駆除の複雑さにつながりました。「マルウェアは本質的に正当な画像ファイルに融合されている」、「インシデント対応チームとA/Vソフトウェアは、保護された患者の健康情報が含まれているため、マルウェアファイルを削除できない」ためです。[15]
GIFAR攻撃
グラフィックス交換フォーマットJavaアーカイブ(GIFAR )は、 GIFとJARファイル形式が同時に存在するポリグロットファイルです。[16]この手法は、セキュリティの脆弱性を悪用するために使用できます。たとえば、画像のアップロードが許可されているWebサイトにGIFARをアップロードし(有効なGIFファイルであるため)、GIFARのJava部分をWebサイトの意図したコードの一部であるかのように実行し、同じオリジンからブラウザーに配信します。[17] JavaはJRE 6 Update 11で修正され、2008年12月にCVEが公開されました。[18] [19]
GIFARが可能なのは、GIF画像がファイルの先頭にヘッダーを保存し、JARファイル(他のZIPアーカイブベースの形式と同様に)がファイルの最後にデータを保存するためです。[20]
関連用語
- ポリグロットプログラミングとは、複数のプログラミング言語を使用してシステムを構築する手法を指しますが、必ずしも同じファイル内である必要はありません。[21] [22]
- ポリグロット永続性も同様ですが、データベースに関するものです。
参照
参考文献
- ^ abc Jonas Magazinius、Billy K. Rios、Andrei Sabelfeld (2013 年 11 月 4 日)。「Polyglots」。2013 ACM SIGSAC コンピュータ & 通信セキュリティ カンファレンス - CCS '13 の議事録。pp. 753–764。doi :10.1145 / 2508859.2516685。ISBN 9781450324779. S2CID 16516484. 2022年9月5日時点のオリジナルよりアーカイブ。2022年9月5日閲覧。
- ^ ab Bridges, Robert A.; Oesch, Sean; Verma, Miki E.; Iannacone, Michael D.; Huffer, Kelly MT; Jewell, Brian; Nichols, Jeff A.; Weber, Brian; Beaver, Justin M.; Smith, Jared M.; Scofield, Daniel; Miles, Craig; Plummer, Thomas; Daniell, Mark; Tall, Anne M. (2023). 「誇大宣伝を超えて: 市販の機械学習ベースのマルウェア検出ツールの評価」。デジタル脅威:研究と実践。4 (2 ) : 1–22。arXiv : 2012.09214。doi :10.1145/3567432。S2CID 247218744。
- ^ abcde Koch, Luke; Oesch, Sean; Adkisson, Mary; Erwin, Sam; Weber, Brian; Chaulagain, Amul (2022). 「多言語ファイルの検出に向けて」. arXiv : 2203.07561 [cs.CR].
- ^ 「ポリグロットXHTML5の利点」。2011年10月12日時点のオリジナルよりアーカイブ。 2022年9月4日閲覧。
- ^ “Polyglot: 8つの言語で学べるプログラム”. 2022年9月6日時点のオリジナルよりアーカイブ。2022年9月6日閲覧。
- ^ “15th International Obfuscated C Code Contest (2000)”. 2022年9月6日時点のオリジナルよりアーカイブ。2022年9月6日閲覧。
- ^ Koch, Luke; Oesch, Sean; Chaulagain, Amul; Dixon, Jared; Dixon, Matthew; Huettal, Mike; Sadovnik, Amir; Watson, Cory; Weber, Brian; Hartman, Jacob; Patulski, Richard (2024). 「ポリグロットファイルの悪用と検出について」. arXiv : 2407.01529 [cs.CR].
- ^ 「ポリグロットXHTML5の利点」。2011年10月12日時点のオリジナルよりアーカイブ。 2022年9月4日閲覧。
- ^ abc 「Polyglot Markup: A robust profile of the HTML5 vocabulary」。2022年8月9日時点のオリジナルよりアーカイブ。2022年9月4日閲覧。
- ^ ポリグロットマークアップ: HTML 互換 XHTML ドキュメント: 6.4 ボイド要素 Archived 2 October 2012 at the Wayback Machine . W3C 編集者草案 2012 年 7 月 9 日。
- ^ “DICOM-TIFF デュアルパーソナリティファイル”. 2022年9月5日時点のオリジナルよりアーカイブ。2022年9月5日閲覧。
- ^ Schofield, Ed. 「チートシート: Python 2-3互換コードの作成」。2022年9月6日時点のオリジナルよりアーカイブ。2022年9月6日閲覧。
- ^ Wolf, Julia (2011年2月9日). 「OMG WTF PDF」.第27回カオスコミュニケーション会議. 2022年10月9日時点のオリジナルよりアーカイブ。 2022年9月6日閲覧。
- ^ Desjardins, Benoit; Mirsky, Yisroel; Ortiz, Markel Picado; Glozman, Zeev; Tarbox, Lawrence; Horn, Robert; Horii, Steven C. (2020年4月). 「DICOM画像がハッキングされた!次はどうなる?」American Journal of Roentgenology . 214 (4): 727–735. doi :10.2214/AJR.19.21958. PMID 31770023. S2CID 208318324. 2022年9月5日時点のオリジナルよりアーカイブ。 2022年9月5日閲覧。
- ^ 「ユビキタスバグにより、HIPAA保護マルウェアが医療画像の背後に隠れることができる」2019年4月17日。2022年9月5日時点のオリジナルよりアーカイブ。2022年9月5日閲覧。
- ^ Byrd, Christopher. 「GIFARの作り方」。2023年3月6日時点のオリジナルよりアーカイブ。2023年3月6日閲覧。
- ^ Eckel, Benjamin (2008年8月5日). 「GIFAR画像の脆弱性」. Hackaday . 2023年3月6日時点のオリジナルよりアーカイブ。 2023年3月6日閲覧。
- ^ “CVE-2008-5343”. cve.mitre.org . 2008年12月4日. 2021年4月20日時点のオリジナルよりアーカイブ。2021年4月20日閲覧。
- ^ McMillan, Robert (2008年8月1日). 「オンライン認証情報を盗む可能性のある写真」. Infoworld.com. 2020年9月18日時点のオリジナルよりアーカイブ。
- ^ Rios, Billy (2008年12月17日). “Billy (BK) Rios » SUN Fixes GIFARs”. 2016年3月14日時点のオリジナルよりアーカイブ。 2021年4月20日閲覧。
- ^ Fjeldberg, Hans (2008). Polyglot Programming - A Business Perspective (PDF) (M.Sc). Norwegian University of Science and Technology. 2016年3月4日時点のオリジナルよりアーカイブ(PDF) 。 2015年5月28日閲覧。
- ^ Gupta, Tripta (2018年12月19日). 「Analyzing Polyglot Microservices」. Medium . 2019年8月5日時点のオリジナルよりアーカイブ。2019年8月5日閲覧。
外部リンク
- ポリグロットマークアップをサポートする Windows 用 CSE HTML バリデーター 2022 年 9 月 18 日、Wayback Machineにアーカイブ
- 多言語 XHTML5 の利点 2011 年 10 月 12 日、Wayback Machineにアーカイブ
- 451の異なる言語を話す多言語話者
- 16の異なる言語を扱う多言語話者 2013年5月14日アーカイブ - Wayback Machine
- 8 つの異なる言語のポリグロット。2003 年 8 月 3 日にWayback Machineにアーカイブされました ( COBOL、Pascal、Fortran、C、PostScript、Unix シェル、Intel x86 マシン言語、およびPerl 5で記述)
- 7つの異なる言語を扱う多言語学者。2012年4月26日にWayback Machineにアーカイブされました(C、Pascal、PostScript、TeX、Bash、Perl、Befunge98で書かれています)
- 6つの異なる言語を扱う多言語学者。2008年11月2日にWayback Machineにアーカイブされました(Perl、C、Unixシェル、Brainfuck、Whitespace、Befungeで書かれています)
- 一般的な多言語話者の一覧 2003年8月13日アーカイブWayback Machine
- PDF-MP3ポリグロット。PDF文書であると同時に、そのコンテンツのMP3オーディオバージョンでもある。2022年6月30日、Wayback Machineにアーカイブ。
- PoC||GTFO、多言語 PDF ドキュメントとして公開されたセキュリティ出版物。2018 年 6 月 24 日にWayback Machineにアーカイブされました。
