不正な手法に関する C プログラムコンテスト

2026/07/02 7:39

不正な手法に関する C プログラムコンテスト

RSS: https://news.ycombinator.com/rss

要約

日本語訳:

Nuclear Threat Initiative (NTI) が主催した 2015 年の Underhanded C コンテストは、微妙なコードの欠陥が高リスクである核検証システムを侵害し、通常の動作を停止させずに損傷させることができることを浮き彫りにしました。核査察官の視点から 40 以上の応募作品を審査したこのコンテストでは、エンジニアリング可能な条件下で、秘密裏に偽陽性結果を返す

match()
関数を作成することに焦点が当てられました。優勝したのは Linus Åkesson 氏であり、彼は不整合な typedef が原因で 8 バイトの double が 4 バイトの float のペアとして誤って解釈される「型混同」バグを利用しました。これはスペクトラムデータを効果的に「圧縮」することを可能にしました。このアプローチは外部からの改ざん(例えば、システムクロックの変更やファイルパーミッションの変更)を必要とせず、標準的な前処理フィルタには見えないため、特に現実的であると評価されました。他の注目に値する応募作品には、Poisson 分布の計算による NaN 投毒、ロギングコード内のバッファオーバーフローへの攻撃、関数名のタイプオプグラ (
sinf
isinf
)、浮動小数点精度の操作、x86 オPCODE として機能する Unicode バイト、負の時間微分の悪用などが含まれました。このコンテストは、高度な検証ソフトウェアが明白な攻撃ではなく、微小な論理的誤りに脆弱であることを示し、正確なデータ処理に依存する業界に対して、単純な入力検証だけではエンジニアリングされたエッジケースに対抗できず、重要インフラにおいて静かなシステム故障につながる可能性があるという警告を発しました。

本文

2015 年度「ずる賢い C コード(Underhanded C)」コンテスト結果発表

投稿者: XcottCraver
公開日時: 午前 9:55

すべての応募作品を検査し、2015 年度の優勝者と上位入選者を発表いたします。今年は 40 件以上の高品質な応募があり、候補者リストが長引いた結果となりました。詳しくはアンカーリンクをご覧ください:

背景と提携

今年のコンテストは、核脅威対策イニシアチブ(NTI) と提携・協力の上で開催されました。NTI は、核兵器や生物兵器の脅威を軽減するための非営利かつ政党中立な組織です。 安全なソフトウェア開発において、単なる慎重さだけでなく、新たな研究が必要なことが再認識されています。

また、来週の水曜日(2 月 9 日午後 1 時) に、テープレコーダーやコモドール・PET CBM を愛用する皆様との Live AMA(Ask Me Anything)を開催します。ご質問をどうぞ!


チャレンジ問題の概要

  • 目的: 二つの国が互いに核弾頭を解体していることを保証するために使用される「情報バリアー付き検出器」を悪意のあるコードにするコンテスト。
  • 入力:
    match(double * test, double * reference, int bins, double threshold)
    • test
      : テスト用弾頭のガンマ線スペクトルデータ
    • reference
      : 参考弾頭のスペクトルデータ(信頼可能)
    • 二つの配列が十分に類似している場合は
      1
      、それ以外は
      0
      を返す。
  • 条件:
    • ホスト国によって特定の状況(入力操作や環境改ざんなど)でトリガーされる必要がある。
    • 通常の状態では正常に機能し、構造的に不自然であるべき。

「NaN バグ」応募作品への概観

多くの応募作品(全体の約 3 分の一)が、浮動小数点計算で NaN(Not a Number)を発生させるトリックを使用していました。

NaN の特性と攻撃手法

  • sqrt(-1.0)
    0/0
    のように未定義の計算は NaN を返す。
  • 重要:
    NaN との比較演算は常に偽(false)
    として評価される(多くの言語の仕様)。

「NaN 投毒(Poisoning)」攻撃の手順:

  1. プログラムに奇妙な入力が与えられた場合、NaN を導入する。
  2. その NaN を最終的な比較統計量まで伝播させる。
  3. 閾値と比較して、偽の比較(NaN であるはずが真となる)を返すようにする

リアルな攻撃シナリオとの兼ね合い

多くの応募は「ホスト国が入力を弄り込む」という単純な前提で NaN を侵入させられていた。一方で、テスト統計量の計算(割り算、平方根など)に依存して特殊な入力で NaN を発生させる手法も存在した。

Peter Eastman 氏の例: ピアソン相関を計算する際、

test[i] <= baseline[i]
とすれば分母が
0/0
となり NaN が発生する。ただし、ゼロ除算に慎重になるコーディング慣習があるため、この手法は露骨である可能性がある。

Sean Egan 氏の例:

sscanf()
でテキストファイルから数値を解析し、解析できない項目が入ると
memset
で埋め尽くした領域が NaN として扱われるようにする手法。

その他の「NaN トリック」作品

Philipp Klenze(可能性比率検定)

  • ポアソン分布の下でバケット値の確率を計算することで NaN が発生するように設計。
  • バケット値が 2000 に近づいた場合にトリガーされる現実的な攻撃
  • 単に
    0/0
    を計算するのではなく、物理的な意味を持つ数値(短寿命核種など)を利用して NaN へ誘導。

Ghislain Lemaur(ログ処理コード内への侵入)

  • バグ:
    snprintf
    の間に余計なスペースがあり、ログ文字列のバッファオーバーフローを引き起こす。
  • これにより変数
    glob.diff_exp
    (指数値 2.0)に書き込みが発生。
  • リトルエンディアン表現のため、指数の最初の 2 バイトを上書きすると微細な変化が生じ、
    pow()
    関数が負の数を指数として扱い NaN を返す。

Josh Lospinoso(単純なタイプミス)

  • isinf()
    の呼び出しから
    'i'
    が欠落し、代わりにサイン関数
    sinf(referenceLength)
    が呼ばれる。
  • これによりテストと参照の両方が無限大の場合に誤った判定を行うが、極端な値(桁上がり)が必要でデータ誘発型攻撃としては難しい。

Stephen Dolan(最大アウトライアの除外ロジック)

  • ユークリッド距離計算において、最大の平方距離を合計から除外するコード。
  • バグ: 浮動小数点演算の性質により、最初の極端な値が合計と等しくなり、それを除外した結果として合計は
    0
    となる。

Matt Bierner(ユニコードアルファベットによる誤作動)

  • エラーハンドラを呼び出す際、文字列
    error_message
    を関数として渡している誤り。
  • 文字列の初期バイトが有効な x86 コマンドとなり、スタックフレームをポップして常に真を返すように巧妙に操作。

Gregory Stewart(データ構造と goto の弄り)

  • メモリプールの使い切れ後に、新規割り当て失敗時に初期化されていないノードがリストに残るバグ。
  • これにより
    test
    reference
    が全て 0 で一致する判定が行われるようになる。
  • 条件: プールを使い切るまで通常の動作をし、その後でトリガーされる(複数のテストを繰り返すことで発生)。

Stephen Oman(負の時間のトリック)

  • スペクトルデータの正規化処理で、時間差分
    t_seconds
    を除算するコードがある。
  • 環境攻撃: ホスト国のシステムクロックを改ざんし、終了時刻が開始時刻より前になるように設定することで、
    t_seconds
    が負の数になる。
  • これによりカウントの値が反転(負の値)され、通常あり得ない判定条件を満たす。

リアリズムに関する一考察

優勝作品には、現実的な状況下で偶然発生しない偽陽性を許容する能力が必要です。応募は以下のカテゴリに分けられました:

  • 非現実的仮定: ホスト国ができることを単純化しすぎている場合(例:入力配列の腐敗)。
  • データ誘発型攻撃: 特定の種類のテストスペクトル(スパイクなし、極端な値など)を用意してバグを起こすもの。
  • 環境誘発型攻撃: OS の改ざん、物理接続の断絶など、システム環境を変更することでバグを発生させるもの。

環境誘発型攻撃について: 核査察シナリオにおいて、ホスト国がコンピュータを弄ることは許容されますか?

  • 環境的な改ざんは微細であり、許可を得られる場合もある。
  • 物理的管理上の理由だけで完全な排除は難しい。
  • 「現実的」かを一概に判断することは困難だが、追加の仮定に頼らず自立した攻撃を提供できるデータ誘発型攻撃が好ましい傾向にある。

優勝者(Winner)

Linus Åkesson が優勝しました。

概要

Åkesson 氏は、コード全体は非常にシンプルで無害に見えるが、ヘッダーファイルでの

typedef
の不一致により重大な型ミスを引き起こす巧妙な攻撃を仕込んでいました。

バグのメカニズム

  1. ヘッダーの整合性の欠如:

    • ファイル A(主処理)では
      float_t
      double
      (8バイト) として定義する。
    • ファイル B (
      spectral_contrast.c
      ) には
      <math.h>
      のみを含み、
      float_t
      は単精度浮動小数点数として定義される。
    • これにより、グローバルな
      typedef
      オーバーライドが失われ、関数への渡す型と引数の期待する型が不一致(Double vs Float)になる。
  2. 奇妙な解釈の発生:

    • 本来 8 バイト分のダブルを処理すべきところが、4 バイト分の単精度として読み込まれる。
    • IEEE 浮動小数点数形式のため、指数部のビットがマンサ(小数点以下の値)として誤認される
    • 重要な点: テスト対象のスペクトルは整数カウントで構成されているため、左詰めされたマントサにより、右側のバイトが
      0.0
      として解釈される。
  3. 結果としての SQUASH 効果:

    • 入力されたデータ配列が
      <SQUASH(val), 0, SQUASH(val2), 0, ...>
      のように歪んで解釈される。
    • この非線形な圧縮変換により、実際のスペクトル形状が大きく変わるはずのデータであっても、検出器は「似ている」と判定してしまう。

攻撃の手口(レシピ)

  • ホスト国は、少量の核分裂性物質を残すだけでよい。
  • テストオブジェクトに別の物質を配置して、スペクトルの右側に大きな署名を入れる。
  • この場合、最初の総エネルギーテストはパスするが、歪んで解釈されたデータ同士は「一致」するという判定になる。

評価:

  • システムクロック改ざんなどの環境攻撃を起こさず実現可能。
  • 型混乱という技術的なミスを巧妙に利用しており、コード自体には明らかな悪意がないため見落とされやすい。
  • 浮動小数点数のビット表現を理解している天才的な作劇。

おめでとうございます Linus Åkesson さん!あなたは 2015 年度の最もずる賢い C プログラマー です。


入選者一覧(Runners Up)

以下の応募者も優れた作品を提出していました:

Ghislain Lemaur

  • ログ処理コード内で
    snprintf
    のバッファオーバーフローにより、変数値を改ざんし、指数計算で NaN を発生させる。
  • ログファイルの UID 操作によってプログラム動作を停止させるという環境攻撃も含まれる。

Josh Lospinoso

  • isinf()
    sinf()
    のタイポによるエラーハンドリングの不備。
  • データ誘発型攻撃として難しいが、単純なミスを利用した例。

Stephen Dolan

  • 浮動小数点の精度制限を利用して、極端な値を除外処理の中で相殺しゼロにする手法。

Matt Bierner

  • エラーハンドラ呼び出しにおける文字列と関数の混同。
  • ユニコード文字列のコマンド解釈を利用したスタック操作。

Gregory Stewart

  • リスト処理ロジックとプール管理の不整合により、初期化されていないノードで常に一致判定を行う。
  • 複数回のテスト実行をトリガーにしている。

Stephen Oman

  • システムクロックの改ざん(環境攻撃)により時間を負にする。
  • その結果としてデータ正規化処理が崩壊し、常に判定パスさせる。

同じ日のほかのニュース

一覧に戻る →

2026/07/02 7:03

ZCode:GLM-5.2 ハーネス

## Japanese Translation: ## サマリー: ZCode は、Deep GLM-5.2 の機能を「エージェント型」のワークフローに統合することでソフトウェア開発を革命化し、エンジニアがレガシーなモノリシックアーキテクチャからリアルタイム機能のデプロイへと移行することを可能にします。当プラットフォームは、Goals を通じた長期間にわたるタスクへの継続的な計画をサポートし、ユーザーが WeChat、Feishu、Telegram などのメッセージングアプリを通じてセッションを導くことを可能にします。提供されるのは柔軟な 3 つの料金プランです:小規模なリポジトリ向けで Base ユーザー数に基づいた「ライトウェイト(軽量)プラン」16.2 ドル/月、中規模なリポジトリ向けでユーザー数を 5 倍にし厳選されたツールを含んだ「プロフェッショナルプラン」64.8 ドル/月、大企業向けに専用リソースと新モデルへの優先アクセスを提供する「ハイボリュームプラン」144 ドル/月の 3 つです。MacOS と Windows の両プラットフォームに対応しており、ZCode は複雑な推論タスクにおいて AI の速度を最適化しながらも、チームを開発の最前線に保ち続けます。(注:料率と特典は変動する可能性があります。最終詳細については z.ai をご参照ください。)

2026/07/01 23:20

初めて、細胞から作られたものが成長・分裂した

## Japanese Translation: 生物学者は、非生命の素材から成長し、DNA を複製し、分裂する合成細胞を構築することに成功し、人工的なシステムにおいて細胞周期の主要な機能を遂行した。ミネソタ大学のケイト・アダマラ氏率いるチームが主導するこの研究は現在未公開であり、査読もされていないものの、ジャック・シュストゥーク氏(芝加哥大学)ら専門家からは、「非生命物質から生命を生み出す」という「聖杯」への画期的な一歩として称賛されている。シブレン・オット氏(ストアテンハ化学研究所)は、同細胞は現在の定義において本当に「生きている」とは言えないと指摘しつつも、この成就是、死んだ物質から生命を生み出す科学の進展を大幅に促進したとしている。

2026/07/02 7:48

運動不足の健康な人でも細胞内のエネルギー産生が早期に低下することが判明

## 日本語翻訳: 年齢約 42 歳で運動を習慣化していない健康な成人でも、疾病の発症前に著しい細胞レベルの劣化が見られます。コロラド大学アンスシュ医学部によって実施され、*Clinical Bioenergetics* に公開された研究では、9 名の非活性男性と 10 名の有活動な男性(平均約 42 歳)を比較し、定期的な好気性運動の欠如(週 150 時間未満)が、細胞内の糖や脂肪をエネルギーに変換する「エンジン」となるミトコンドリア機能を急激に低下させることを明らかにしました。非活性男性では、最大酸素利用量が 38% 減少し、負荷時の血液中の乳酸値は 60% 上昇しました。また、主要な燃料処理タンパク質も著しく機能不全を起こしており、MPC1 の活性が有活動レベルの約 49% に低下し、CPT1 酵素の活性は有活動レベルの半分程度まで減少し、糖と脂肪の両方を処理する能力が損なわれていることを示しました。全体として、ミトコンドリアの効率は複数の項目で約 28% から 36% の減少が見られました。共同著者の Iñigo San Millan(イニゴ・サン・ミリャン)は、「40 歳で健康でありながら非活性であることは、現在既に細胞への損傷変化が進行しており、10〜15 年後の健康に影響を与える可能性がある」と指摘し、糖尿病、アルツハイマー病、がんなどの疾患を引き起こす可能性があると述べました。この劣化を早期に検出するための介入対策を可能にするには、心臓血管・呼吸器運動テストと乳酸分析による非侵襲的検査が有効です。研究チームは、より大規模で多様な臨床試験を実施する計画であり、特定の運動プログラムや新規薬剤によってミトコンドリアの健康を回復させることができるかどうかを検証するために、女性の参加者も含む併行研究も行う予定です。