Skip to content

fix: サーバ応答由来のバッファオーバーフロー/NULL参照を修正#132

Merged
pyama86 merged 1 commit into
masterfrom
fix/server-response-buffer-overflow
Jun 4, 2026
Merged

fix: サーバ応答由来のバッファオーバーフロー/NULL参照を修正#132
pyama86 merged 1 commit into
masterfrom
fix/server-response-buffer-overflow

Conversation

@pyama86

@pyama86 pyama86 commented Jun 4, 2026

Copy link
Copy Markdown
Member

概要

セキュリティレビューで発見した、STNSサーバ応答を信頼することに起因するメモリ安全性の問題を修正します。

NSSモジュール(libnss_stns.so)とSSH鍵ラッパー(stns-key-wrapper)は sshd/login/sudo/cron 等の特権プロセス(多くはroot)にロードされ、改竄され得る入力(サーバ侵害・MITM・ssl_verify=false・平文HTTP・ローカルcache-stnsd経由)を処理します。応答値の長さ・NULLを検証していなかったため、特権プロセスのメモリ破壊につながり得ました。

修正内容

🔴 Critical: スタックバッファオーバーフロー (stns.h STNS_SET_DEFAULT_VALUE)

サーバ応答の shell/directory/password を固定長 char[MAXBUF](1024) へ strcpy していたため、1024バイト超でスタックを破壊。
snprintf(buf, sizeof(buf), ...) で境界制限。

🟠 High1: NULL参照によるDoS (stns.h SET_ATTRBUTE)

gecos/name がNULL(応答にフィールド欠落時)でも未チェックで strnlen/strcpy していてクラッシュ。
→ NULLを "" として扱う。

🟠 High2: 鍵連結ロジックのメモリ不具合 (stns_key_wrapper.c)

  • 内側/外側ループで同じ変数 i を使用していた → j に分離
  • key のNULLチェック追加
  • realloc 戻り値チェック追加
  • バッファサイズを strnlen(keys) ではなく追跡中の size で計算(NUL未終端時のヒープオーバーリード回避)
  • keys がNULLのままの出力をガード

ビルド緩和策 (Makefile)

CFLAGS-fstack-protector-strong -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 を追加。

テスト

  • stns_passwd_test.c: 長いshellでスタックを破壊しないこと / gecos欠落でクラッシュしないこと
  • stns_shadow_test.c: 長いpasswordでスタックを破壊しないこと

CIのASANビルド(make test)で境界違反を検出する設計です。
stns_key_wrapper.c はユニットテスト対象外のため integrationテスト/コードレビューで担保。

レビューで検出した残課題(本PR対象外・別途検討)

  • 設定ファイル stns.conf が644で配置され auth_token/password がworld-readable
  • HTTPヘッダコールバックの堅牢性(User-Highest-Id:値なしでtrim(NULL)strtokの非スレッドセーフ)
  • 応答累積サイズの上限なし(メモリ枯渇DoS)
  • 固定ロックファイル /var/tmp/.stns.lock による名前解決DoS

NSSモジュールおよびキーラッパーは、改竄され得る(サーバ侵害/MITM/ssl_verify=false/平文HTTP/ローカルcache-stnsd経由)STNSサーバ応答を処理する。
複数のフィールドが長さ/NULL検証なしに固定長スタックバッファへコピーされており、特権プロセス(sshd/login/sudo等)でスタックバッファオーバーフローやNULL参照を引き起こし得た。

- stns.h: STNS_SET_DEFAULT_VALUE が char[MAXBUF] への strcpy ではなく snprintf を使用 (shell/directory/password)
- stns.h: SET_ATTRBUTE が NULL を "" として扱い strnlen(NULL)/strcpy クラッシュを防止 (gecos/name)
- stns_key_wrapper.c: 内側/外側ループ変数の衝突解消, key の NULL チェック, realloc 戻り値チェック, size ベースのバッファ計算, keys が NULL の場合の出力ガード
- Makefile: -fstack-protector-strong -D_FORTIFY_SOURCE=2 を追加

長い shell/password と gecos 欠落のユニットテストを追加。
@pyama86 pyama86 merged commit d154e35 into master Jun 4, 2026
1 check passed
@pyama86 pyama86 deleted the fix/server-response-buffer-overflow branch June 4, 2026 03:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants