SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

連載記事

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZine BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
C/C++セキュアコーディング入門

脆弱性体質の改善
――C/C++セキュアコーディング入門(1)

「動けばいいってもんじゃない」 脆弱性を作り込まないコーディング 第1回


  • X ポスト
  • このエントリーをはてなブックマークに追加

 この連載では、深刻な被害をもたらす可能性のある「プログラムの脆弱性」を未然に防ぎ、セキュアなコーディングを行うための知識やコツを紹介していきます。世界中のCのプロフェッショナルが作成したCのコーディング規約集「CERT C セキュアコーディングスタンダード」というドキュメントをベースにしています。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 皆さんこんにちは。JPCERTコーディネーションセンターという組織でセキュアコーディングに関する取り組みに携わる筆者らが、これからこの連載を担当させていただくことになりました。どうぞよろしくお願いします。なお、JPCERTコーディネーションセンターは、情報セキュリティインシデントへの対応支援や、ソフトウエアの脆弱性(いわゆるセキュリティホール)に関する製品開発者間における公開日の調整や関連情報の公開なども行っています。

 この連載では、バッファーオーバーフロー等の脆弱性をうっかり作り込んでしまったがために、数千万円ものコストをかけて、ユーザに告知し、製品を回収して、工場でファームウェアをアップデートする事態に陥ったり、あるいは脆弱性を放置してユーザを危険にさらし、それが明るみに出て「世間を騒がす」ことになったりしなくても済むように、そもそもの製品開発時からセキュアなプログラムを書くために必要なノウハウをお伝えする予定です。そんな「悲劇」が自分の身に降りかからないとも限らない、ということを実感していただければ幸いです。

 本連載のベースになっているのは、当組織も参加しているプロジェクトが公開している「CERT C セキュアコーディングスタンダード」(以下、CERT C)というドキュメントです。CERT Cは、米国カーネギーメロン大学SEI/CERTのスタッフを中心に世界中のCのプロフェッショナルが作成したCのコーディング規約集で、wikiを使って作成されており、現在もなお更新され続けています。

 数あるコーディング規約の中でCERT Cが特徴的なのは、セキュリティの観点から、どのようなコーディングが脆弱性を作り込んでしまうのかをまとめているという点にあります。バグがプログラムの不具合につながるのに対し、脆弱性には単なる不具合にとどまらず、外部の攻撃者が脆弱性を突いてユーザを危険にさらすリスクがあります。実際に脆弱なコードの多くは、「よくあるコーディングエラー」が原因で作り込まれています。そのようなコーディングエラーを特定し、正しくコーディングする方法をまとめたものが CERT C のルールとレコメンデーションという形で提供されています。

言語仕様が落とし穴になる

 Cには言語仕様に複雑あるいは曖昧な規定が少なからず存在します。複雑な規定の代表は、オペレータの優先順位や整数の型変換に関するルールです。プログラマはこれらのルールを正しく理解した上でコーディングできることが求められています。曖昧な規定の代表は「未定義の動作」です。C99 Annex. Jには約190もの未定義の動作がまとめられています。プログラマがある環境での動作を想定して書いたコードが「未定義の動作」に該当する場合、そのコードが実行される環境によっては、プログラマの想定とは異なる動作をする可能性があります。これが脆弱性を作り込む原因になることがあるのです。

 一般に、Cは実行時エラーチェックが手薄な言語です。それは、現在のC言語の仕様が、「Cの精神」(the spirit of C) に基づいて作られているためでもあります。その精神は次の言葉に表されています(JIS X 3010から引用)。

  • プログラマを信頼する
  • プログラマが必要である事柄を行おうとすることを妨げない

 信頼されたプログラマ、つまり言語仕様上の「落とし穴」を正しく理解したプログラマであればその穴に陥らずにプログラムを書けるはずである、また、プログラムに現れない余計な動作は極力行わない、という設計思想に基づいて作られた言語がCなのです。しかし実際には、落とし穴の理解不足がたたり、現実に脆弱性が作り込まれてしまった例は枚挙にいとまがありません。

 CERT Cはこのような言語仕様上の「落とし穴」を把握するための参考資料として活用することができます。言語仕様書を読む機会はあまりないかもしれませんが、本連載をきっかけに興味をもって頂き、CERT Cを通じてC言語仕様の理解を深めていただければと思います。

 次回以降の本連載の構成は、14のカテゴリーに分類された CERT Cのルールから、ポインタ演算、動的メモリ管理、文字列操作、型変換などのトピックを選んで解説しつつ、セキュアコーディングに活用できるツールの紹介やセキュアなプログラム開発全般の話題も折り混ぜていく予定です。お楽しみに。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
C/C++セキュアコーディング入門連載記事一覧

もっと読む

この記事の著者

久保 正樹(JPCERT コーディネーションセンター)(クボ マサキ(JPCERT コーディネーションセンター))

脆弱性アナリストJPCERTコーディネーションセンター慶応義塾大学環境情報学部卒。ソニーでデスクトップPCのソフトウェア開発に携わったのち、米国ダートマス大学にてオーディオ信号処理、電子音響音楽の研究を行い、電子音響音楽修士を取得。2005年4月よりJPCERTコーディネーションセンターにて、脆弱性...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4572 2009/11/27 16:06
" ); }

おすすめ

アクセスランキング

  1. 1
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    計測と改善をひたすら繰り返したら、年間コストを1億円削減した──不確実性の高いプロジェクトに挑む
  4. 4
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  5. 5
    VSCodeをドキュメント作成に活用――テキストエディタ、Markdownエディタの設定と拡張機能を解説
  1. 6
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  2. 7
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  3. 8
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!
  4. 9
    生成AI時代に求められるエンジニア像とは? 2024年CodeZine人気記事ランキング
  5. 10
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース

アクセスランキング

  1. 1
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    計測と改善をひたすら繰り返したら、年間コストを1億円削減した──不確実性の高いプロジェクトに挑む
  4. 4
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  5. 5
    VSCodeをドキュメント作成に活用――テキストエディタ、Markdownエディタの設定と拡張機能を解説
  6. 6
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  7. 7
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  8. 8
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!
  9. 9
    生成AI時代に求められるエンジニア像とは? 2024年CodeZine人気記事ランキング
  10. 10
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    「CUDA」 ~マンガでプログラミング用語解説
  3. 3
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  4. 4
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  5. 5
    Google、社内AIエージェント「Google Agentspace」発表
  6. 6
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  7. 7
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  8. 8
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  9. 9
    ITエンジニア本大賞2025、投票締切直前! みんなで選んだ歴代の大賞本を振り返って一挙紹介
  10. 10
    管理職の24.1%、今後管理職を「続けたくない」と回答。理由は「責任やストレス」が最多に

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

メールバックナンバー

アクセスランキング

  1. 1
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    計測と改善をひたすら繰り返したら、年間コストを1億円削減した──不確実性の高いプロジェクトに挑む
  4. 4
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  5. 5
    VSCodeをドキュメント作成に活用――テキストエディタ、Markdownエディタの設定と拡張機能を解説
  1. 6
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  2. 7
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  3. 8
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!
  4. 9
    生成AI時代に求められるエンジニア像とは? 2024年CodeZine人気記事ランキング
  5. 10
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース

アクセスランキング

  1. 1
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    計測と改善をひたすら繰り返したら、年間コストを1億円削減した──不確実性の高いプロジェクトに挑む
  4. 4
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  5. 5
    VSCodeをドキュメント作成に活用――テキストエディタ、Markdownエディタの設定と拡張機能を解説
  6. 6
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  7. 7
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  8. 8
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!
  9. 9
    生成AI時代に求められるエンジニア像とは? 2024年CodeZine人気記事ランキング
  10. 10
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    「CUDA」 ~マンガでプログラミング用語解説
  3. 3
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  4. 4
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  5. 5
    Google、社内AIエージェント「Google Agentspace」発表
  6. 6
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  7. 7
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  8. 8
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  9. 9
    ITエンジニア本大賞2025、投票締切直前! みんなで選んだ歴代の大賞本を振り返って一挙紹介
  10. 10
    管理職の24.1%、今後管理職を「続けたくない」と回答。理由は「責任やストレス」が最多に