Fast16: Stuxnetより5年早かった高精度ソフトウェア・サボタージュ
(sentinelone.com)- 2005年に作成された未文書化サボタージュ・フレームワークで、選択された計算ソフトウェアのメモリコードをパッチして数値結果を歪めるよう設計されている
svcmgmt.exeは表向きはサービスラッパーのように見えるが、内部にLua 5.0仮想マシンと暗号化されたバイトコード、補助DLL、fast16.sysドライバーを格納し、タスク別ペイロードを分離実行するfast16.sysはブート開始ファイルシステムドライバーとして非常に早い段階でロードされた後、Intel C/C++コンパイラでビルドされた.EXEを選別し、カーネルレベルでメモリパッチを実行する- パッチエンジンは101個のルールで動作し、とくにFPU命令ブロックを用いて内部配列値のスケーリングを変え、土木工学、物理学、工程シミュレーションのような特殊計算ツールを狙った痕跡を残している
- ShadowBrokers流出の
fast16標識と組み合わせると、Stuxnet以前の時期の精密産業サボタージュがすでに組み込みスクリプティング、狭いターゲティング、カーネルパッチを組み合わせた形で存在していたことが明らかになる
概要と識別の手がかり
fast16は2005年のコアコンポーネントを持つ未文書化サイバー・サボタージュ・フレームワークで、fast16.sysが高精度計算ソフトウェアを選択的に狙い、メモリ上でコードをパッチして計算結果を歪めるsvcmgmt.exeは表向きはWindows 2000/XP時代の一般的なサービスラッパーのように見えるが、内部にLua 5.0仮想マシンと、サービスエントリポイントが解除する暗号化バイトコード・コンテナを格納している- Luaベースのマルウェアを探索する過程で、バイトコードのマジックバイト
1B 4C 75 61、バージョンバイト、LUA_PATH、特徴的なC APIが手がかりとなり、その流れでsvcmgmt.exeが特定された svcmgmt.exe内部のC:\buildy\driver\fd\i386\fast16.pdbという文字列が、サービス実行ファイルとカーネルドライバープロジェクトを結びつけるフォレンジック上の手がかりとなった- 2017年のShadowBrokers流出の
drv_list.txtにも同名の**fast16**が登場し、svcmgmt.exeのPDB文字列と精密サボタージュ用ドライバーをひとつの流れとして結びつけている - ShadowBrokers側の回避シグネチャには
fast16 *** Nothing to see here – carry on***という文言が含まれる
キャリア構造と実行方式
svcmgmt.exeはコマンドライン引数に応じて動作を変える適応型キャリアとして設計されている- 引数なし: Windowsサービスとして実行される
-p:InstallFlag = 1に設定してサービスとして実行される-i:InstallFlag = 1に設定してLuaコードを実行する-r: インストールフラグなしでLuaコードを実行する- それ以外の
<filename>: 元のコマンドと-r引数を付けたコマンドの2つの子プロセスを生成するWrapper/Proxyモードで動作する
- 内部ストレージには暗号化Luaバイトコード、補助DLL、
fast16.sysドライバーがまとめて入っている - Lua環境は基本状態を超えて拡張されており、
wstringモジュール、内蔵対称暗号関数b、Windows NTファイルシステム・レジストリ・サービス制御・ネットワークAPIバインディングモジュールを提供する - 外部キャリアバイナリは比較的安定して維持し、タスク別ペイロードは暗号化された形で分離することで、環境や作戦目標に合わせて再利用できるようにしている
svcmgmt.exeの識別値は次のとおり- ファイル名
svcmgmt.exe - サイズ
315,392 bytes - MD5
dbe51eabebf9d4ef9581ef99844a2944 - SHA1
de584703c78a60a56028f9834086facd1401b355 - SHA256
9a10e1faa86a5d39417cae44da5adf38824dfb9a16432e34df766aa1dc9e3525 - タイプ
PE32 executable for MS Windows 4.00 (console), Intel i386 - リンク時刻
2005-08-30 18:15:06 UTC
- ファイル名
ワームレット伝播と回避構造
svcmgmt.exeは複数のwormletを搭載できるクラスター弾型キャリアのように動作し、確認されたサンプルには1つのSCM wormletだけが含まれている- 実行フローは、設定準備、ワイド文字列変換、権限昇格、
SvcMgmtサービスのインストール・起動、条件付きのfast16.sys配置、wormletの放出、初期遅延、失敗しきい値または外部終了条件までの反復実行へと続く - SCM wormletはWindows 2000/XP環境を狙い、脆弱またはデフォルトの管理者パスワードが設定されたファイル共有を利用してネットワークサーバーを見つけ、ペイロードをコピーした後にリモートサービスを起動する
- 伝播はカスタムのネットワークプロトコルではなく、サービス制御APIやファイル共有APIといった標準的なWindows管理機能に依存して行われる
- インストール前に
ok_to_install()はok_to_propagate()を呼び出して環境を点検し、手動で強制されていない場合は特定のセキュリティ製品のレジストリキーの存在によって伝播可否を決定する - 以下のレジストリキーのうち1つでも存在すればインストールを中止し、監視環境への配布を避ける
HKLM\SOFTWARE\Symantec\InstalledAppsHKLM\SOFTWARE\Sygate Technologies, Inc.\Sygate Personal FirewallHKLM\SOFTWARE\TrendMicro\PFWHKLM\SOFTWARE\Zone Labs\TrueVectorHKLM\SOFTWARE\F-SecureHKLM\SOFTWARE\Network Ice\BlackIceHKLM\SOFTWARE\McAfee.com\Personal FirewallHKLM\SOFTWARE\ComputerAssociates\eTrust EZ ArmorHKLM\SOFTWARE\RedCannon\FireballHKLM\SOFTWARE\Kerio\Personal Firewall 4HKLM\SOFTWARE\KasperskyLab\InstalledProducts\Kaspersky Anti-HackerHKLM\SOFTWARE\Tiny Software\Tiny FirewallHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Look n Stop 2.05p2HKCU\SOFTWARE\Soft4EverHKLM\SOFTWARE\Norman Data Defense SystemsHKLM\SOFTWARE\Agnitum\Outpost FirewallHKLM\SOFTWARE\Panda Software\FirewallHKLM\SOFTWARE\InfoTeCS\TermiNET
connotify.dllは最小限のレポートチャネルの役割を担う- Windows
AddConnectNotify()APIで登録され、RASベースの新しいネットワーク接続が発生するたびに呼び出される - 難読化文字列を復号してnamed pipe
\\.\pipe\p577を取得し、ローカルパイプに接続してリモート・ローカル接続名を記録した後に終了する - 独立実行モジュールではなく、ホストプロセスによる登録が必要
- ファイル名
svcmgmt.dll - サイズ
45056 bytes - MD5
410eddfc19de44249897986ecc8ac449 - SHA1
675cb83cec5f25ebbe8d9f90dea3d836fcb1c234 - SHA256
8fcb4d3d4df61719ee3da98241393779290e0efcd88a49e363e2a2dfbc04dae9 - リンク時刻
2005-06-06 18:42:45 UTC - タイプ
PE32 DLL (i386, 4 sections)
- Windows
ドライバー構造とメモリパッチ方式
fast16.sysはフレームワーク内で最も強力なコンポーネントで、ブート開始ファイルシステムドライバーとして設定され、ディスクドライバーとともに非常に早い段階でロードされる- 設定は
Start=0、Type=2、SCSIクラスグループで、NTFS、FAT、MRxSMBの上に自身を挿入する - 初期侵入時に
Session Manager\PrefetchParameters配下のEnablePrefetcher値を 0 に設定し、その後のコードページ要求がファイルシステムスタック全体を通るようにする - 単純な XOR 文字列暗号化と
ntoskrnl.exeのスキャンでカーネル API を動的に解決し、\Device\fast16、\??\fast16、カスタムDeviceType0xA57C を公開する IoRegisterFsRegistrationChangeにより、アクティブおよび新規のファイルシステムデバイスの上に worker device object を取り付け、IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_CLOSE、IRP_MJ_QUERY_INFORMATION、IRP_MJ_FILE_SYSTEM_CONTROLと関連する Fast I/O 経路を迂回させる- ブート時点でロードされるが、実際の カーネルレベルのコード注入エンジン は
explorer.exeが開かれた後で初めて有効化される - パッチ対象は次の2条件を同時に満たす必要がある
- ファイル名が
.EXEで終わる - 最後の PE セクションヘッダー直後に
Intelで始まる表示可能な ASCII 文字列がある
- ファイル名が
- この条件は Intel C/C++ コンパイラ でビルドされた実行ファイルを狙ったもので、標的ソフトウェアのツールチェーンを把握していたことを示す
- 条件に合うファイルには、メモリ内の PE ヘッダー修正が適用され、
.xdata、.pdataの2つのセクションを新たに注入し、元のコードセクションのバイトを埋め込んでクリーンなコードのコピーを維持する fast16.sysの識別値は次のとおり- ファイル名
fast16.sys - サイズ
44,580 bytes - MD5
0ff6abe0252d4f37a196a1231fae5f26 - SHA1
92e9dcaf7249110047ef121b7586c81d4b8cb4e5 - SHA256
07c69fc33271cf5a2ce03ac1fed7a3b16357aec093c5bf9ef61fbfa4348d0529 - タイプ
PE32 executable for MS Windows 5.00 (native), Intel i386, 5 sections - リンク時刻
2005-07-19 15:15:41 UTC
- ファイル名
ルールベースのパッチエンジンと標的の特性
- パッチエンジンは 101個のルール で構成された最小限の状態ベーススキャナーで、ファイルがディスクから読み込まれる際にパターンマッチングと置換ロジックによって実行コードをメモリ上で密かに書き換える
- 性能維持のため、256バイトの dispatch array で一部の先頭バイトだけを素早くふるいにかけ、パターン内部の wildcard を許容し、一部のルールは状態フラグを設定・検査して多段階の修正シーケンスを実行する
- パッチパターンの大半は、x86 コードで実行フローを乗っ取る、または影響を与える一般的な命令シーケンスに対応しているが、1つははるかに大きい FPU 命令ブロック で構成されている
- この FPU ブロックは精密演算と内部配列値のスケーリング専用コードで、一般的な悪性注入とは異なる性格を示す
- 研究チームはパッチルールを YARA シグネチャ の16進パターンに変換して同時代のソフトウェアコーパスに適用し、2つ以上のパターンに一致するファイルは10個未満と極めて少なかった
- ヒットしたファイルは共通して、土木工学、物理学、物理プロセスシミュレーションのような 特殊分野の計算ツール だった
- FPU パッチは3つの内部配列に渡される値をスケーリングして計算を微妙に変え、目的が不正アクセスや一般的な拡散ではなく 数値結果の改ざん にあったことを示す
- 正確な標的バイナリとワークロードの両方を確認できていないため、配列の意味は完全には特定されていない
- 別システムで計算を検証すればこのようなサボタージュは失敗する可能性があるが、同じネットワークとセキュリティ環境を共有する複数システムに同じドライバーが配布されていれば、独立した検算に不一致が生じる可能性 も低くなる
- 付録には、パッチエンジンの一部の抽出パターンがそのまま掲載されている
48 89 84 24 9C 00 00 00 4B 0F 8F 79 FF FF FF 00D8 E1 D9 5D FC D9 04 0055 8B EC 83 EC 14 53 56 57 8B 3D ?? ?? ?? ?? 8B 0D 008D 1D ?? ?? ?? ?? 52 8D 05 ?? ?? ?? ?? 51 8D 15 ?? ?? ?? ?? 8D 0D ?? ?? ?? ?? 53 50 52 51 56 57 E8 ?? ?? ?? ?? 83 C4 38 EB 0E 83 EC 04 00B9 01 00 00 00 C1 E7 02 8B BF ?? ?? ?? ?? 8B D7 85 FF 8B 55 30 8B 45 30 D8 C9 8B 75 2C 00 9A 8B 00 00 00 1B 00 90 0F 94 C3 0B D8 33 D2 83 3D 00
パッチ対象候補
- パターンマッチング結果が最も強く重なった対象は LS-DYNA 970、PKPM、MOHID だった
- LS-DYNA 970 は、極限条件下で材料と構造の挙動を解析する工学シミュレーションソフトウェアで、自動車衝突、爆発、衝撃、金属成形、製造工程を扱い、自動車、航空宇宙、防衛・軍事研究、製造・材料科学で使われていた
- 1976年から開発されてきた
- MD5
1d2f32c57ae2f2013f513d342925e972 - SHA1
2fa28ef1c6744bdc2021abd4048eefc777dccf22 - SHA256
5966513a12a5601b262c4ee4d3e32091feb05b666951d06431c30a8cece83010 - ファイルサイズ
5,225,591 bytes - リンクタイム
2003-10-24 16:34:57 UTC - ファイルタイプ
PE32 executable for MS Windows 4.00 (console), Intel i386, 7 sections
- PKPM は中国で広く使われている 構造工学 CAD 製品群 で、建築構造設計の全工程を扱う複数の実行モジュールで構成される
- SATWE は床、梁、柱、壁、フレーム全般の3次元構造解析を担う中核エンジンである
- コンクリートせん断設計モジュール識別値
- MD5
af4461a149bfd2ba566f2abefe7dcde4 - SHA1
586edef41c3b3fba87bf0f0346c7e402f86fc11e - SHA256
09ca719e06a526f70aadf34fb66b136ed20f923776e6b33a33a9059ef674da22 - ファイルサイズ
7716864 bytes - ファイルタイプ
PE32 executable for MS Windows 4.00 (GUI), Intel i386, 6 sections - リンクタイム
2011-08-26 10:58:17 UTC
- MD5
- Building Structure CAD モジュール識別値
- MD5
49a8934ccd34e2aaae6ea1e6a6313ffe - SHA1
3ce5b358c2ddd116ac9582efbb38354809999cb5 - SHA256
8b018452fdd64c346af4d97da420681e2e0b55b8c9ce2b8de75e330993b759a0 - サイズ
11849728 bytes - リンクタイム
2005-12-01 08:35:46 UTC - MD5
e0c10106626711f287ff91c0d6314407 - SHA1
650fc6b3e4f62ecdc1ec5728f36bb46ba0f74d05 - SHA256
06361562cc53d759fb5a4c2b7aac348e4d23fe59be3b2871b14678365283ca47 - サイズ
16355328 bytes - リンクタイム
2012-07-07 08:47:11 UTC
- MD5
- SATWE 構造解析エンジン識別値
- MD5
2717b58246237b35d44ef2e49712d3a2 - SHA1
d475ace24b9aedebf431efc68f9db32d5ae761bd - SHA256
bd04715c5c43c862c38a4ad6c2167ad082a352881e04a35117af9bbfad8e5613 - サイズ
9908224 bytes - リンクタイム
2011-01-12 06:37:39 UTC - MD5
daea40562458fc7ae1adb812137d3d05 - SHA1
1ce1111702b765f5c4d09315ff1f0d914f7e5c70 - SHA256
da2b170994031477091be89c8835ff9db1a5304f3f2f25344654f44d0430ced1 - サイズ
8454144 bytes - リンクタイム
2012-11-29 03:10:12 UTC - MD5
2740a703859cbd8b43425d4a2cacb5ec - SHA1
ca665b59bc590292f94c23e04fa458f90d7b20c9 - SHA256
aeaa389453f04a9e79ff6c8b7b66db7b65d4aaffc6cac0bd7957257a30468e33 - サイズ
16568320 bytes - リンクタイム
2014-12-30 03:23:43 UTC - MD5
ebff5b7d4c5becb8715009df596c5a91 - SHA1
829f8be65dfe159d2b0dc7ee7a61a017acb54b7b - SHA256
37414d9ca87a132ec5081f3e7590d04498237746f9a7479c6b443accee17a062 - サイズ
8089600 bytes - リンクタイム
2009-04-22 01:46:46 UTC - MD5
cb66a4d52a30bfcd980fe50e7e3f73f0 - SHA1
e6018cd482c012de8b69c64dc3165337bc121b86 - SHA256
66fe485f29a6405265756aaf7f822b9ceb56e108afabd414ee222ee9657dd7e2 - サイズ
9219072 bytes - リンクタイム
N/A
- MD5
- 追加の PKPM CAD ファイル識別値
- MD5
075b4aa105e728f2b659723e3f36c72c - SHA1
145ef372c3e9c352eaaa53bb0893749163e49892 - SHA256
c11a210cb98095422d0d33cbd4e9ecc86b95024f956ede812e17c97e79591cfa - サイズ
6852608 bytes - リンクタイム
2012-06-18 10:01:54 UTC - MD5
cf859f164870d113608a843e4a9600ab - SHA1
952ed694b60c34ba12df9d392269eae3a4f11be4 - SHA256
7e00030a35504de5c0d16020aa40cbaf5d36561e0716feb8f73235579a7b0909 - サイズ
8392704 bytes - リンクタイム
2012-11-29 03:10:12 UTC
- MD5
- MOHID は、ポルトガル・リスボンの Instituto Superior Técnico の MARETEC が開発した オープンソースの水系モデリングシステム で、海洋・沿岸の水理力学、水質シミュレーション、堆積物移動、油流出モデリング、ラグランジュ粒子追跡を扱う
- 現時点でも意図された攻撃効果を断定的には特定できていないと述べている
- MD5
f4dbbb78979c1ee8a1523c77065e18a5 - SHA1
9e089a733fb2740c0e408b2a25d8f5a451584cf6 - SHA256
e775049d1ecf68dee870f1a5c36b2f3542d1182782eb497b8ccfd2309c400b3a - ファイルサイズ
5443584 bytes - ファイルタイプ
PE32 executable for MS Windows 4.00 (console), Intel i386, 3 sections - リンクタイム
2002-10-18 09:29:54 UTC
- LS-DYNA は、イランの JCPOA Section T 違反疑惑に関する公開報道で、核兵器開発に関連するコンピュータモデリング 研究とともに言及されたことがある
検知ルールと侵害指標
-
侵害指標
- 確認されたファイル3種は fast16.sys、connotify.dll、svcmgmt.exe である
fast16.sys: MD50ff6abe0252d4f37a196a1231fae5f26, SHA192e9dcaf7249110047ef121b7586c81d4b8cb4e5, SHA25607c69fc33271cf5a2ce03ac1fed7a3b16357aec093c5bf9ef61fbfa4348d0529connotify.dll: MD5410eddfc19de44249897986ecc8ac449, SHA1675cb83cec5f25ebbe8d9f90dea3d836fcb1c234, SHA2568fcb4d3d4df61719ee3da98241393779290e0efcd88a49e363e2a2dfbc04dae9svcmgmt.exe: MD5dbe51eabebf9d4ef9581ef99844a2944, SHA1de584703c78a60a56028f9834086facd1401b355, SHA2569a10e1faa86a5d39417cae44da5adf38824dfb9a16432e34df766aa1dc9e3525
-
apt_fast16_carrier
- carrier、Luaペイロード、平文の亜種を捉えるよう設計されており、基準ハッシュは
9a10e1faa86a5d39417cae44da5adf38824dfb9a16432e34df766aa1dc9e3525である - Luaバイトコードのマジック
1B 4C 75 61、build_wormlet_table、unpropagate、scm_wormlet_install、install_implant、start_worm、ok_to_propagateの文字列を使用する Symantec、Sygate Personal Firewall、Zone Labs\TrueVector、Kaspersky Anti-Hackerなど多数のセキュリティ製品レジストリキーを条件に含む- 暗号化文字列のバイトパターン、暗号定数2個、保存コンテナ長の復号コード、
file文字列を含む保存レコードのシグネチャもあわせて検知する - 条件はMZヘッダーと10MB未満のファイルを基準に、
$s*3個、$rk*12個、任意の$e*項目、暗号定数2個の近接配置、$code1と$stor1のいずれか1つを満たすか、Luaマジックと$s*7個を満たす場合に成立する
- carrier、Luaペイロード、平文の亜種を捉えるよう設計されており、基準ハッシュは
-
apt_fast16_driver
- driver または関連プロジェクトファイルを捉えるよう設計されており、基準ハッシュは
07c69fc33271cf5a2ce03ac1fed7a3b16357aec093c5bf9ef61fbfa4348d0529である @(#)foo.c :、@(#)par.h :、@(#)pae.h :、@(#)ree.c :のようなソースファイル識別文字列を多数使用する\\Device\\fast16、\\??\\fast16、C:\\buildy\\、driver\\fd\\i386\\fast16.pdb、push 0A57Ch ; DeviceTypeパターンを含むExAllocatePool、ExAllocatePoolWithTag、ExFreePool、ExFreePoolWithTagをXOR形式でプッシュするAPIパターンもシグネチャに含まれる- 条件は10MB未満のファイルでMZヘッダーとともに、PDBパス2個、
C:\\buildy\\とソース識別子1個、#devtype == 3、pe.machine == pe.MACHINE_I386、pe.subsystem == pe.SUBSYSTEM_NATIVE、任意のapi*、dev*2個のいずれか1つを満たすか、ソース識別子6個を満たす場合に成立する
- driver または関連プロジェクトファイルを捉えるよう設計されており、基準ハッシュは
-
clean_fast16_patchtarget
- パッチ対象ソフトウェア を検知し、
most probably cleanと表記されており、基準ハッシュは8fcb4d3d4df61719ee3da98241393779290e0efcd88a49e363e2a2dfbc04dae9である $el0から$el99まで続く多数のバイトパターンを使用する- 条件は20MB未満のファイル、MZヘッダー、定義されたシグネチャのうち 2個以上一致 である
- パッチ対象ソフトウェア を検知し、
-
apt_fast16_patch
- パッチコード 自体を検知し、静的にパッチされたファイルやメモリダンプ内に存在する可能性がある
- 基準ハッシュは
0ff6abe0252d4f37a196a1231fae5f26である $p1、$p2、$p3の3つのバイトパターンを定義する- 条件は
any of themで、3つのパターンのうち1つだけ一致しても検知される
系譜と歴史的含意
- バイナリ内の
@(#)par.h $Revision: 1.3 $という文字列は、このフレームワークの系譜を推測させる手がかりとなる @(#)接頭辞は1970〜1980年代のUnixにおける SCCS/RCS 系ソース管理の慣習を示しており、2000年代半ばのWindowsカーネルドライバでこうした痕跡はまれである- こうしたアーティファクトは、典型的なWindows専業開発者よりも、古い高セキュリティUnix環境の文化とツールチェーンに慣れたベテランエンジニアの痕跡に近く見える
svcmgmt.exeはVirusTotalにほぼ10年前にアップロードされていたが、現在でも検知率は非常に低く、1つのエンジンだけが限定的な信頼度で一般的なマルウェアとして分類している- ShadowBrokersの Territorial Dispute シグネチャと組み合わせると、
fast16は深刻なステルス型 国家級サイバー・サボタージュ の開発時点を見直させる fast16は、より広く知られた系統よりも先んじて、組み込みスクリプティングエンジン、コンパイラベースの狭域ターゲティング、カーネルレベルのパッチ を組み合わせた一貫した構造を示している- 長年にわたり公開分析、命名されたキャンペーン、代表的事件との結び付きがほとんどなく、内部に残された人間可読な標識も
*** Nothing to see here – carry on***のように抑制的なものにとどまっている - その後の Lua- and LuaJIT-based toolkits へと続くAPT進化の流れの中の接点として位置付けられる
1件のコメント
Hacker Newsの意見
このくだりが特に面白かった
SCCS/RCS表記法が2005年のWindowsカーネルコードに出てきたのは、今どきのオフィスでダイヤル式電話を見るようなものだ、というたとえだったが、かなり説得力があった
2006年に働いていた天体物理の研究室でも、まだsvnを使っていて、コードベースには70〜80年代のシステムの痕跡が残るFortranがたくさんあった
それでも最新の最適化コンパイラのおかげでうまく動いていたし、90年代にVaxからLinuxへ移行した過程も驚くほどスムーズだった
昔聞いたdo over or make dueの発表を思い出すが、だいたい、ちゃんと動いている大きなコードベースを丸ごと書き直すのは、現代のツールでどうにか継ぎはぎして使えるなら、それに見合う価値はないという話だった
名前はMKSで、特定のリビジョンツリーを"project file"として管理する方式だったが、Java EEで作り直した版ですらなく、90年代の古い版のままのようだった
ファイルの先頭には
$Revision: 1.3 $のようなタグやchangelogが入っていたが、新しいファイルのかなりの数はタグ自体を入れておらず、置換もされず、一貫性はめちゃくちゃだった対象デバイス系列は90年代半ばから始まっていたが、その時点のコード自体は実質的に5年以上古いものはほとんどなかった
エンジニアが数十人しかいなくてもコミット衝突が頻発し、ツリー全体がしょっちゅう壊れていた
面白半分で全履歴を読んでgitへ取り込むスクリプトを書いたが、数年さかのぼっただけでも記録は完全にカオスだった
なぜあの時点までそれを使っていたのかは分からないが、ハードウェア企業では思ったより最近までソース管理を「リモート共有フォルダ」程度に見ていることがあり、そのせいでソフトウェア側のバージョン管理が優先されていなかったのだと思う
数値計算の世界では、その系譜が今でも土台の役割を果たしている
2000年代までRCSを使っている場所は実際にあったし、ツール自体もSVNやCVSより優れている点があった
たとえばfast16はもともと科学計算ソフトウェアを作っていた人が、StunexはSiemensで働いていた人が書いたのかもしれない、と想像してしまう
最初にコードがリファクタリングを必要とするようになった原因がそのまま残っていれば、結局また同じ状態に戻ってしまう
その原因は、開発者の習慣、信念、職業的トラウマのような心理的レイヤーにまで深く食い込んでいることも多い
そこにコンウェイの法則まで重なると、チームは結局より大きな組織構造に似たソフトウェアを作るしかなく、組織が変わらなければリファクタリングの結果もだいたい繰り返される
例外があるとすれば、別チームのコードベースや前任者のコードを引き継いで構造を組み直すときくらいだ
だが同じ人たちが自分のコードのリファクタリングを宣言すると、たいていは自分たちにとってより使いやすいネズミ捕りをもう一つ作るだけに終わりがちだ
自分の思考様式の産物を反復的に改善するのは構わないが、メリーゴーラウンドから降りるには、悪いアーキテクチャの原因を書き出して、自分自身を冷静に点検する必要がある
多くの開発者が信じたがるように、「注意深く誠実であれば、多少悪い設計でもうまく実装できる」というのは、たいてい正しくない
結局のところ根っこは設計であり、そこから育った木を受け入れるか切り倒すかしなければならず、枝払いだけでは限界が大きい
この記事はかなりぞっとする
このマルウェアが20年間検知網の下に潜っていたという事実だけでも十分に不気味だ
気になる人向けのダウンロードリンク
https://bazaar.abuse.ch/sample/9a10e1faa86a5d39417cae44da5ad...
たぶんまずWindows XP VMを作ることになりそう
あれはローダーにしか見えない
IEEE-754は+-*/とsqrtについてのみ正しい丸めを強制する
sin/cos/exp/log/powのような超越関数については最後の数ULPの差を許容しており、glibc、musl、MSVC、Intel SVMLも実際そのように動作する
PIDは基本演算だけを使うのでlibm差分の影響を受けにくいが、モータのベクトル制御やセンサーの線形化では毎サイクルこうした関数に触れるため、小さな不一致が蓄積する
そのためソースコードのdiffがまったくなくても、リンクされたlibmだけが変わって現場での動作がドリフトすることがある
この種の差はPayne-Hanek argument reductionや最悪のtable-maker's dilemmaの境界で実際に現れる
おそらくそのため、安全必須システムのガイドは単に「IEEE-754準拠」と書くのではなく、特定のlibmビルドを固定するのだろう
本当にすごい発見だ
これらのルールが正確にどの対象を狙い、結果をどう変えたのかものすごく気になる
もしかすると原子炉のように、非常に特定のシミュレーション条件でのみ差が出るよう設計されていたのかもしれない
たとえば公開マニュアル[1]にあるEOS_JWL方程式はLS-DYNAが実装している式だが、他の式と組み合わせれば、ミサイル弾頭の起爆装置が主装薬を起爆し、20mの距離で特定の圧力波を作るまでにかかる時間などを計算するのに使えそうだ
その結果を逆に使えば、必要な信管タイミングも推定できる
LS-DYNAに入る式とパラメータは[2]のような科学研究に由来しており、これは1980年代の米国政府による高性能爆薬の実験研究だ
そこには、爆薬がそれを包むさまざまな材料と摩擦する特性を測定した実験も含まれている
爆薬モデリング用の式はすでに用意されているので、そうした式を少しだけいじって摩擦係数に±20%のノイズを乗せるだけでも、科学者やエンジニアはソフトウェア操作より先に鋼材の製造品質の問題を疑う可能性が高い
現代的なたとえをするなら、ある敵対国が、中国のクラッキンググループが中国の掲示板に上げたAnsys Autodyn 2026 R1の海賊版を、ロシアのISPの背後にいる少数のシーダーから落として使うような状況を想像できる
そして後になって実験値と計算値がどうにも一致しないとき、そこで初めて海賊版が意図的に改ざんされていた可能性を疑うのかもしれない
ただ、今ではその敵対国が、無作為な大学や航空宇宙・防衛コンサル企業の侵害されたネットワークから正規コピーを抜いてくるほうが簡単かもしれない
2026年の敵対国がソフトウェアをまったくゼロから作れないと考えるのもナイーブかもしれず、手計算や実験への依存だけでも望む結果に到達できる
結局、製造品質を検証するには実験設備と能力がもともと必要だ
シミュレーションソフトウェアは主に、模型製作や物理実験の回数を減らしてコストと時間を節約するだけだ
たとえば[3]のように砲弾が装甲板に当たる状況を1000回回すのは安いが、現実でそれを繰り返すのははるかに高くつき、時間もかかる
[1] https://ftp.lstc.com/anonymous/outgoing/jday/manuals/LS-DYNA...
[2] https://www.osti.gov/servlets/purl/6530310
[3] https://www.youtube.com/watch?v=_dv2PecKUBM
私が公開するものにRCSリビジョンデータが付いているのを見たら、人に少しでも立ち止まってほしい
最近読んだ本はSandworm: A New Era of Cyberwar and the Hunt for the Kremlin's Most Dangerous Hackers、Andy Greenberg著
かなり良かったし、新情報が次々に出ているので、続編シリーズが必要になるかもしれないと思う
Guixと再現可能コンピューティングがPowerPCやレガシーマシンにまで移植可能になっていくのを見ると、政府や1984みたいな機関、そして中東のいくつかの組織は本当に嫌がりそうだ
環境がより異種混在であるほど有利だ
核心となる数字はワームだ
他のコンピュータで検査しても見つからない、なぜなら、そもそもクリーンな2台目のコンピュータ自体がないからだ
面白い発見ではあるが、ソース管理に関するコメントは少しずれている感じもする
あの時代にもSCCSに近いものはまだ残っていただろうし、CVSが似たスタイルだったのか一瞬混乱もする
開発者たちがもともとUNIX側の作業もしていた人たちだと示唆しているが、SCCS/RCSはそちらでは一般的だったからだ