
COBOLレガシーシステム向けのセキュリティ強化ツールキット — 不可視Unicode検出、フォーマット境界分析、ソース変換の完全性
COBOLレガシーシステム向けセキュリティ監査ツールキット
VTR Research Methodologyの一部 | DOI: 10.5281/zenodo.22063208 ステータス: 再現可能 | ライセンス: MIT | トラック: 重要インフラ
GnuCOBOLソースにおけるコンパイルコンテキストの相違、不可視Unicode攻撃、および安全でないCOBOLパターンを検出します。同じソースファイルを-fixedと-freeでコンパイルすると異なるプログラムが生成されます — 本ツールはその相違を可観測かつ再現可能にします。
git clone https://github.com/LuisCastellanos-dev/cobol-shield
cd cobol-shield
bash tools/poc_compiler_flag.sh
本ツールはリモートコード実行、権限昇格、ネットワークエクスプロイトを主張または実証するものではありません。検出結果はVTR方法論に従いCONFIRMADO、PROBABLE、またはOBSERVADOとして分類されます — 分類は証拠の強さを反映するものであり、影響の深刻度を示すものではありません。
COBOLレガシーシステム向けセキュリティ監査ツールキット
GnuCOBOLソースにおける不可視Unicode攻撃、安全でないCOBOLパターン、およびフォーマット変換の完全性問題を検出します。 GnuCOBOL 3.1.2で検証済み。IBM Enterprise COBOLまたはMicro Focusでの動作は未検証 — コンパイラ固有のフラグセマンティクスが異なる可能性があります。
PIC Xは何でも受け入れます。あなたのバッチはそうすべきではありません。
cobol-shieldは2つの異なる脅威サーフェスをカバーします:
1. Unicode不可視文字 — CVE-2021-42574およびGlasswormクラスのベクターで、 視覚的なコードレビューを回避し、PIC Xフィールドを静かに破壊します。
2. COBOL静的解析 — レガシーソースにおける安全でないパターン: 未初期化の working-storage、チェックされていないSTRING/UNSTRINGオーバーフロー、REDEFINESのサイズ不一致、 および変換下で意味が変わる固定フォーマットの位置条件。
| ファイル | 目的 |
|---|---|
tools/check-invisibles.py | CIチェッカー — 不可視Unicode検出時に終了コード1 |
tools/clean-invisibles.py | フォレンジック監査ログ付きサニタイザ |
src/AUDITOR-INVISIBLE.cob | HEX-OFを使用したCOBOL内バイトバリデータ |
tools/cobol_rules.py | 静的解析ルール R-01からR-04 |
tools/transform_renumber.py | 固定フォーマット再番号付けシフトシミュレータ (フェーズ2) |
tools/poc_compiler_flag.sh | 決定的PoC — 同一ファイル、-fixed対-free、コンパイラフラグの相違 |
tools/poc_differential.sh | フェーズ2差分PoC — SOURCE A対SOURCE B (手動移行) |
各ルールはVTR Finding Schema v1出力を生成し、context_loaderを介して
cryptofaultおよびvtr-forensic-imgと互換性があります。
| ルール | 名前 | 深刻度 | 分類 |
|---|---|---|---|
| R-01 | UNINITIALIZED_WS | 高 | HECHO |
| R-02 | UNSTRING_NO_OVERFLOW | 高 | HECHO |
| R-03 | REDEFINES_SIZE_MISMATCH | 高 | HECHO |
| R-04 | FORMAT_BOUNDARY_ANALYSIS | 情報 | PROYECCION |
R-01 — UNINITIALIZED_WS VALUE句なしで宣言され、PROCEDURE DIVISION内でINITIALIZEまたはMOVEもされていない Working-Storage変数を検出します。バッチおよびCICS環境における暗黙の未定義動作リスク。
R-02 — UNSTRING_NO_OVERFLOW ON OVERFLOW処理なしのSTRING/UNSTRING文を検出します。入力がターゲットフィールド長を 超えた場合の暗黙の切り捨て。
R-03 — REDEFINES_SIZE_MISMATCH 再定義されるフィールドがそのベースよりも多くのバイトを宣言しているREDEFINESを検出します。 メモリ境界違反リスク — コンパイラ依存の動作。
R-04 — FORMAT_BOUNDARY_ANALYSIS (フェーズ1 — 観察のみ) 固定フォーマットCOBOLソースにおける位置条件を検出します:
COL73_NONEMPTY — 識別領域 (列73–80) 内の非空白コンテンツCOL7_VERB — コメント行内のCOBOL実行可能動詞 (列7 = * / / / D)SOURCE_BOUNDARY — 列80を超えるコンテンツR-04はseverity=info、classification=PROYECCIONを生成します。これは
フォーマット条件を文書化するものであり、脆弱性ではありません。影響評価には変換
差分解析 (フェーズ2) が必要です。
中心命題: COBOL固定フォーマットファイルは、ビルドに使用されるコンパイラフラグに よって異なるセマンティクスを持ち、そのフラグはソースファイルの外側に存在する。
GnuCOBOL 3.1.2で実証、単一アーティファクト、無修正:
bash tools/poc_compiler_flag.sh
cobc -x -fixed poc-same-file.cbl → compiles → output: 0000001000
cobc -x -free poc-same-file.cbl → 10 compilation errors
-fixedの場合: 6行目の列7=*はコメントインジケータ — MOVE 999999
は休眠状態であり、プログラムは実行され1000を表示します。
-freeの場合: シーケンス番号000100...001000が数値リテラルとして
解析されます — PROGRAM-IDヘッダーが見つからないと報告され、すべての行が
エラーを生成します。同じファイルが構文的に無効となります。
コンパイラフラグはソースファイル内にはありません。それはMakefile、 CI設定、またはオペレータの起動コマンド内に存在します。それを変更すること — 意図的であれ偶発的であれ — は、プログラムが有効かどうか、そして何をするかを 変えてしまいます。
証拠: corpus/fixed-format/poc-evidence.md
SHA-256および完全なエラーログを文書化。
以前のPoCは手動移行を介して同じ命題を実証しています:
SOURCE A (fixed-format, col7='*' dormant): output → 0000001000
SOURCE B (free-format, code active): output → 0000999999
SHA-256 A: b70a948a0df5e8f685e82f5bffc9c4710f2c0a7a23b6294e7ca20092c2d25d37
SHA-256 B: f5fd80f79ed3e5be97628f89790256d6fba80605dce2b7985b729b5fef6f26d5
制限事項: SOURCE Bは不正確な移行の手動表現であり、 実際の再番号付け下でのIBM Z Open EditorまたはIBM SCUの出力ではありません。 上記のコンパイラフラグPoCにはこの制限はありません。
検出範囲:
| コードポイント | 名前 | リスク |
|---|---|---|
| U+0001–U+001F | C0 Controls | バッチ異常終了 |
| U+200B–U+200F | Zero-Width | データ破損、VSAM切り捨て |
| U+202A–U+202E | Bidi Override | Trojan Source — CVE-2021-42574 |
| U+2066–U+2069 | Bidi Isolate | 方向スプーフィング |
| U+FE00–U+FE0F | Variation Selectors | Glasswormクラスのステガノグラフィ |
| U+E000–U+F8FF | Private Use Area | ペイロード隠蔽 |
| U+FEFF | BOM | 暗黙の先頭バイト付加 |
# Byte-level inspection
hexdump -C source.cob | grep -E "e2 80 (8b|ae)"
# Unicode CI check — exits 1 on detection
python3 tools/check-invisibles.py .
# Sanitize with forensic audit log
python3 tools/clean-invisibles.py . --report audit-$(date +%Y%m%d).log
# Run static analysis rules
python3 -c "
from tools.cobol_rules import scan_path_r01, scan_path_r02, scan_path_r03, scan_path_r04
import json
for f in scan_path_r02('your-source.cbl'):
print(f.to_json())
"
# Transformation differential PoC
bash tools/poc_differential.sh
- name: Check for invisible Unicode
run: python3 tools/check-invisibles.py .
PIC X(n)は生のバイトバッファです。検証なしで任意のバイトシーケンスを
受け入れます。Zowe APIレイヤーがMOVEを介してJSONをCOBOLコピーブックに
渡すと、不可視Unicodeがレコードに静かに侵入します。
固定フォーマットCOBOLは第2のサーフェスを追加します: 位置列セマンティクス (列7はインジケータ領域、列73–80は識別領域) はフォーマット依存です。 これらのセマンティクスを保持しない移行ツールは、休眠コードを活性化したり、 プログラム構造を静かに破壊したりする可能性があります。
CVE-2021-42574との共通メカニズムは検出ギャップです — 視覚的検査を 回避するコンテンツ。データフィールド切り捨てベクターとフォーマット変換 ベクターは、CVE-2021-42574で説明されているソースコードのセマンティック 反転とは異なります。
pip install pytest
python -m pytest tests/ -q
# 159 tests, 0 failures
コンパイラスコープ: すべてのルールはGnuCOBOL 3.1.2のみに対して検証されています。IBM Enterprise COBOLおよびMicro Focus COBOLは、異なるフラグセマンティクス、列境界動作、および拡張機能サポートを持っています。これらのコンパイラでの結果は未検証です — テストされるまでINFERENCIAとして分類してください。
R-04キーワードマッチング (COL7_VERB): コメント行内のCOBOL動詞の検出は固定キーワードリストを使用します。リストにないセキュリティ関連動詞を含むコメント行は偽陰性を生成します。R-04がPROYECCIONに分類されるのはこのためです — これは条件を文書化するものであり、確認された脆弱性ではありません。
cfg-shieldアナログ — 機能名依存性: METHODOLOGY.mdに文書化されているクロス言語方法論は、機能/フラグ名が認識可能な命名規則に従うことを前提としています。非記述的な名前 (例: legacy、compat) を持つセキュリティ関連フラグは、手動レビューなしでは正しく分類されない可能性があります。
単一コンパイラPoC: 決定的PoC (poc-same-file.cbl) はGnuCOBOL下での相違を実証しています。同じ相違クラスは他のCOBOLコンパイラでも予想されますが、まだ検証されていません。
MIT