Fix vulnerability

Closes #740 (closed)

セキュリティ脆弱性の修正(C / Fortran)

概要

FrontISTR の C ソースおよび Fortran ソースに存在するセキュリティ脆弱性・堅牢性の問題を修正する. 静的解析および手動コードレビューで検出した,バッファオーバーフロー,NULLポインタ参照,ダブルフリー,ロジックエラー,リソースリーク,文字列バッファ長不足などの問題を対象とする.

目的

  • OWASP Top 10 に該当するインジェクション系脆弱性(バッファオーバーフロー)を排除する
  • 異常入力・リソース不足時のクラッシュ(Segmentation Fault / Bus Error)を防止する
  • メモリ破壊につながるダブルフリー・ロジックエラーを修正する
  • Fortran 側のファイル I/O・メモリ確保に対するエラーハンドリングを追加する
  • 結果出力ラベルの文字列バッファ長不足による切り詰めを防止する

変更内容

C ソース(32 ファイル, +264 / -183 行)

1. バッファオーバーフロー防止:sprintf → snprintf

sprintf を snprintf に置換し,バッファサイズを明示的に指定した.

対象ファイル:

  • fistr1/src/lib/utilities/fstr_ctrl_util.c
  • hecmw1/src/common/hecmw_control.c
  • hecmw1/src/common/hecmw_dist_refine.c
  • hecmw1/src/common/hecmw_io_abaqus.c
  • hecmw1/src/common/hecmw_io_nastran.c
  • hecmw1/src/common/hecmw_result_io_bin.c
  • hecmw1/src/common/hecmw_result_io_txt.c
  • hecmw1/src/couple/hecmw_couple_info.c
  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_elem_sr_adapt.c
  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_mesh2graph.c
  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_read_control.c
  • hecmw1/src/visualizer/hecmw_fstr_output_femap.c
  • hecmw1/src/visualizer/hecmw_vis_combine.c
  • hecmw1/src/visualizer/hecmw_vis_font_texture.c
  • hecmw1/src/visualizer/hecmw_vis_pvr_main.c
  • hecmw1/src/visualizer/hecmw_vis_read_control.c
  • hecmw1/src/visualizer/hecmw_vis_rendering.c
  • hecmw1/src/visualizer/hecmw_vis_surface_main.c
  • hecmw1/src/visualizer/hecmw_visualizer.c

2. sscanf 幅指定の追加

sscanf(..., "%s", ...) にフィールド幅制限(%63s 等)を追加し,バッファオーバーフローを防止した.

対象ファイル:

  • hecmw1/src/common/hecmw_result_io_txt.c

3. fopen / fclose の NULL チェック追加

fopen の戻り値を検査し,ファイルオープン失敗時の NULL ポインタ参照を防止した.

対象ファイル:

  • hecmw1/src/common/hecmw_ablex.c
  • hecmw1/src/common/hecmw_io_dist.c
  • hecmw1/src/common/hecmw_io_hec.c
  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_elem_sr_adapt.c
  • hecmw1/src/visualizer/hecmw_fstr_output_vtk.c

4. malloc / HECMW_strdup の NULL チェック追加

動的メモリ確保の戻り値を検査し,メモリ不足時の NULL ポインタ参照を防止した.

対象ファイル:

  • hecmw1/src/visualizer/hecmw_fstr_output_exo.c
  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_mem_util.c
  • hecmw1/tools/result_file_merger/fstr_rmerge_util.c

5. ダブルフリーの修正

HECMW_couple_free_boundary_ids() において,boundary_ids->ids を解放すべき箇所で誤って boundary_ids 自体を解放していた問題を修正した.

対象ファイル:

  • hecmw1/src/couple/hecmw_couple_control.c

6. 条件式のロジックエラー修正

free() 呼び出しの前の NULL チェックで,対象と異なるポインタを検査していた問題を修正した.

対象ファイル:

  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_data_transfer.c

7. exit(0) → exit(EXIT_FAILURE) の修正

エラー発生時の exit(0)(正常終了)を exit(EXIT_FAILURE) に修正し,呼び出し元が異常終了を正しく検知できるようにした.

対象ファイル:

  • hecmw1/src/common/hecmw_msg.c
  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_comm_util.c
  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_data_transfer.c
  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_mesh2graph.c
  • hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_read_control.c
  • hecmw1/src/visualizer/hecmw_vis_define_parameters.c
  • hecmw1/src/visualizer/hecmw_vis_define_parameters_vr.c

Fortran ソース(14 ファイル, +106 / -57 行)

8. open 文への iostat 追加

open 文に iostat パラメータを追加し,ファイルオープン失敗時のエラーハンドリングを実装した.

対象ファイル:

  • fistr1/src/analysis/dynamic/freq/fstr_frequency_analysis.f90
  • fistr1/src/common/fstr_precheck.f90
  • fistr1/src/common/fstr_setup.f90
  • fistr1/src/main/fistr_main.f90
  • hecmw1/src/common/hecmw_util_f.F90
  • hecmw1/src/solver/matrix/hecmw_matrix_ordering_CM.f90
  • hecmw1/src/solver/solver_direct/hecmw_ordering.F90
  • hecmw1/src/solver/sparse_matrix/sparse_matrix.f90

9. allocate 文への stat 追加

allocate 文に stat パラメータを追加し,メモリ確保失敗時のエラーハンドリングを実装した.

対象ファイル:

  • fistr1/src/analysis/static/readtemp.f90
  • fistr1/src/common/fstr_setup.f90
  • fistr1/src/lib/contact/bucket_search.f90
  • hecmw1/src/solver/communication/hecmw_solver_SR.F90
  • hecmw1/src/solver/matrix/hecmw_matrix_contact_lagrange.f90

10. deallocate 前の associated チェック追加

未割り当てポインタの deallocate によるクラッシュを防止するため,associated() チェックを追加した.

対象ファイル:

  • fistr1/src/common/fstr_rcap_io.F90

11. 文字列バッファ長の拡張

結果出力ラベル用の文字列バッファ長を拡張し,層番号が大きい場合のラベル切り詰めを防止した.

  • clyr: character(len=6) → character(len=16)
  • cnum: character(len=4) → character(len=12)
  • 対応する呼び出し側の空白リテラルを 16 文字に統一

対象ファイル:

  • fistr1/src/analysis/static/make_result.f90

12. Fortran FORMAT 文の構文修正

write 文のフォーマット指定子にカンマが欠落していた箇所を修正した.

対象ファイル:

  • fistr1/src/analysis/dynamic/freq/fstr_frequency_analysis.f90
  • fistr1/src/main/fistr_main.f90

影響範囲

  • hecmw1/src/common/ — 共通ライブラリ(ファイル I/O, 結果出力, メッシュ細分化)
  • hecmw1/src/couple/ — カップリング処理
  • hecmw1/src/operations/dynamic_load_balancing/ — 動的負荷分散
  • hecmw1/src/visualizer/ — 可視化処理(VTK, FEMAP, ExodusII, PVR 等)
  • hecmw1/src/solver/ — ソルバ(通信, 行列, 直接法, スパース行列)
  • hecmw1/tools/result_file_merger/ — 結果ファイルマージツール
  • fistr1/src/lib/utilities/ — ユーティリティ
  • fistr1/src/analysis/ — 解析処理(静解析, 動解析, 周波数応答解析)
  • fistr1/src/common/ — FrontISTR 共通処理
  • fistr1/src/main/ — メインプログラム

変更規模

分類 ファイル数 追加行数 削除行数
C ソース 32 +264 -183
Fortran ソース 14 +106 -57
合計 46 +370 -240

テスト

  • ビルド成功を確認(CMake + make)
Edited by Kanato Kono

Merge request reports

Loading
Loading