Skip to main content

自動車製造およびソフトウェア定義車両(SDV)における脆弱性のないC/C++開発

著者
blog feature snyk code party

2024年10月23日

0 分で読めます

ソフトウェア定義車両(SDV)の登場により、自動車業界は歴史上、他に類を見ない転換点を迎えています。2024年4月16日から18日にデトロイトで開催されたSAE(Society of Automotive Engineers)World Congressでは、自動車業界の研究開発と技術革新に5,000億ドルを超える投資が見込まれる市場があることが明言されました。SDVへの移行により、自動車業界の創成期から続く従来の「一度きりの購入」モデルでは不可能だった、機能やサービスのサブスクリプションを通じた新たな収益源が生まれます。

自動車メーカーとサプライヤーは、半導体をイノベーションの中心に据えた電気・電子(E/E)アーキテクチャを軸に、テクノロジー企業への転換を目指しています。さらに、SDVを実現する重要な要素として、マイクロサービス、コンテナ化アーキテクチャ、そして大規模なクラウドコンピューティング環境があります。

この分野のソフトウェア開発では、信頼性、効率性、堅牢性に優れたプログラミング言語として、ほぼ全面的にCとC++が使われています。しかし、これらの言語には、数十年前から知られるバッファオーバーフローやメモリ安全性の問題など、セキュリティリスクがあります。SDV市場は、ソフトウェアのセキュリティを確保するというSnykのミッションに直結しています。自動車メーカーはSnykのInfrastructure as Code(IaC)やContainer製品、そして各種クラウドプロバイダーとのシームレスな連携を活用できます。

たとえば、Mercedesは一歩先を進んでいます。その一例がMB Operating Systemです。

私たちは、消費者向けに提供されてからわずか6か月のQualcomm Gen4 8295を採用し、利用可能な最高のハードウェアを迅速に統合しました。これは意欲的なプロジェクトでした。チームがこの挑戦を受け入れ、20GBのコンパイル済みコードを作り上げ、MB.OSの先駆けとなるシステムをEクラスに搭載したことを、私は非常に誇りに思います。ここで得た知見は、本格的なMB.OS 1.0のリリースに不可欠です。

C/C++のMISRA準拠

MISRA C:2023ガイドラインは主に、アプリケーションセキュリティに関係する側面を含め、重要システムの安全性と信頼性に重点を置いています。特に、脆弱性が安全上のリスクにつながる可能性がある場合に重要です。MISRA C:2023ガイドラインは幅広いトピックを扱っていますが、未定義動作、メモリ破損、不正アクセス、その他の一般的な脆弱性を防ぐ実践を促すことで、アプリケーションセキュリティを高めるうえで特に重要なルールや指針があります。

Cのガイドラインと同様に、MISRA C++:2023の仕様書も、アプリケーションセキュリティに関連する複数のルールと指針を、準拠コードと非準拠コードの例とともに示しています。

C/C++開発に関するMISRA準拠ガイドラインには、セキュアなC/C++ソフトウェアの開発とアプリケーションセキュリティに関する指針やルールが含まれています。たとえば、次のようなものがあります。

  • MISRA指針4.12 - 動的メモリ割り当てを使用してはならない:動的メモリ割り当てを制限すると、メモリ管理エラーに関連する一連の脆弱性を防止できます。

  • MISRAルール1.3 - 未定義または重大な未規定の動作があってはならない:未定義動作はセキュリティ脆弱性につながる可能性があるため、このルールはセキュリティ上、非常に重要です。

  • MISRAルール18.1 - ポインターオペランドに対する算術演算の結果であるポインターは、そのポインターオペランドと同じ配列の要素を指さなければならない:このルールは、Cプログラムでよく見られる脆弱性である範囲外アクセスの防止を目的としています。

  • MISRAルール21.3 - <stdlib.h>のメモリ割り当て関数および解放関数を使用してはならない:指針4.12と同様に、動的メモリ割り当てを避けることで、メモリ管理に関する脆弱性のリスクを低減できます。

  • MISRAルール22.1~22.20(リソース):エラー処理やリソース解放など、リソースを適切に管理することは、リークや枯渇を防ぐうえで不可欠です。これらはサービス拒否攻撃に悪用されたり、攻撃者が利用できる未定義動作につながったりする可能性があります。

MISRA C仕様では、ガイドラインを「セキュリティ」対策と明示的に位置づけてはいません。しかし、包括的なルールや指針に従うことで、C/C++コードにおける一般的なセキュリティ脆弱性の原因を数多く取り除き、ソフトウェアのセキュリティ体制を強化できます。堅牢で明確に定義された動作を促すことで、安全で信頼性の高いセキュアなシステムの開発を支援します。

Snykが支援できること

Snykは、C/C++を扱う開発者を含め、開発者がコードをセキュアにできるよう支援しています。DevSecOpsのようにセキュリティを開発ライフサイクルに組み込むことで、脆弱性が重大な問題になる前に発見できるようにします。さらに、Snykを使えば、コードを保存した時点で安全でないコードパターンを検出できます。継続的インテグレーション(CI)やビルドパイプラインの完了を待つ必要も、コードのコンパイルも不要です。

Snyk Codeなどのツールを使えば、C/C++のコードベースをスキャンして脆弱性を見つけ、修正に役立つ具体的な情報を得られます。

たとえば、C++でよく見られる脆弱性であるバッファオーバーフローを考えてみましょう。次の簡単なコードスニペットで、この問題を確認できます。

#include <iostream>
#include <cstring>

void vulnerableFunction(char* input) {
    char buffer[10];
    // ❌ Potential buffer overflow
    strcpy(buffer, input);
}

int main() {
    char input[20] = "This is a long string";
    vulnerableFunction(input);
    return 0;
}

このC++プログラムでは、入力文字列がバッファのサイズを超えると、strcpy関数によってバッファオーバーフローが発生する可能性があります。Snykはこうした脆弱性の特定に役立ち、strncpyのような、より安全な代替手段を提案します。

void secureFunction(char* input) {
    char buffer[10];
    strncpy(buffer, input, sizeof(buffer) - 1);
    buffer[sizeof(buffer) - 1] = '\0'; // Ensure null-termination
}

SnykをIDEにインストールすると、次の2つの強力な機能を利用できます。

  1. Snykは、このバッファオーバーフローのような脆弱性のあるコードを、コンパイルなしで検出します。

  2. Snykは、Snyk Agent Fixを使って修正案を提示します。

実際の動作を見てみませんか?こちらをご覧ください。

Snyk installed in your IDE

セキュアなコーディング手法を取り入れ、Snykのようなツールを活用することで、開発者はC/C++コードベースの脆弱性リスクを大幅に軽減できます。今すぐSnykに登録して、重要なソフトウェアプロジェクトのセキュリティを確保しましょう。

セキュアで準拠したC/C++コードと、安全でない脆弱なコードの例

MISRAのガイドラインや仕様が実際のコードや脆弱性とどう結びつくかを示すため、前述のリストにある望ましくない動作(MISRAルール1.3)の例として、Cプログラムprogram2.cを見ていきましょう。

Cプログラムのコードは次のとおりです。

#include <stdio.h>

void undefinedBehavior() {
    int x = 5 / 0;
    printf("Value of x: %d\n", x);
}

int main() {
    undefinedBehavior();
    return 0;
}

ゼロ除算はCにおける未定義動作であり、予測不能な結果を引き起こす可能性があります。MISRAガイドラインがこのような演算を禁止しているのは、重要なソフトウェアの安全性とセキュリティを確保するためです。

まずプログラムをコンパイルし、その後実行します。

$ gcc program2.c -o program2
$ ./program2

GCCコンパイラがゼロ除算について警告を出すことがわかります。

program2.c:5:15: warning: division by zero is undefined [-Wdivision-by-zero]
    int x = 5 / 0;
              ^ ~
1 warning generated.

しかし、これは単純で短いプログラムです。実際には、大規模なコードベースの中からこのような問題を見つけるのは難しく、コンパイラの警告が標準出力に大量に流れてくることもあります。

Snyk Codeで脆弱性を検出する

コンパイラの警告に表示される「ゼロ除算」などの未定義動作エラーやその他の問題は、開発サイクルの後半まで見つからないことがあります。Snyk Codeは、コードをコンパイルする前にコードベースをスキャンして脆弱性を検出し、開発の早い段階で問題を特定するのに役立ちます。

Snykは静的コードアプリケーションセキュリティエンジンに機械学習を採用し、プログラムの呼び出しフローを理解して、シンクからソースへとたどるコードパスを特定します。そのため、コードをコンパイルせずに、安全でないコードやコードベースに潜む潜在的な脆弱性を見つけられます。

未定義動作を示す、脆弱性のあるCプログラムのコード

C/C++のセキュリティ準拠とセキュアなコードのためのツール

C/C++コードのMISRA準拠を確認できるオープンソースツールには、次のようなものがあります。

  • OpenMRC:OpenMRCは、Eclipse CDT(C/C++ Development Tooling)プラグインとして開発されたオープンソースのMISRA-Cルールチェッカーです。ソフトウェア定義車両のコードをMISRA-C:2004ガイドラインに照らして分析し、機能安全への準拠に向けてソースコードを更新できるよう、違反を通知します。

  • Clang-misracpp2008:現在はアーカイブされていますが、このプロジェクトはLLVM/Clangの基盤を使い、MISRA C++:2008ルールに対応したオープンソースのチェッカーを作成することを目指していました。現在は開発が終了しており、開発者は代替ツールとしてclang-tidy-misraを推奨しています。clang-misracpp2008はLLVM/Clangプラグインとして実装され、独自ロジックとコンパイラ提供のフラグを使ってMISRA C++ルールに対応しようとする取り組みを示しています。

上記のツールに加え、メンテナンス状況や、セキュリティテストの品質管理基準と包括的な判定基準を満たしているかどうかも踏まえて、Snykも選択肢として検討できます。

Snykのセキュリティプラットフォームには、開発者向けのリアルタイムSASTであるSnyk Codeが含まれます。開発者にとって使いやすいエクスペリエンスを提供しながら、コードのセキュリティを強化します。検出結果には学習リソースや修正の参考となるサンプルが含まれ、Snyk Agent Fixによる自動修正が利用できる場合もあります。

Snykは無料で利用でき、Snyk IDE拡張機能のインストール、BitbucketやGitHubからのGitリポジトリのインポート、Snyk CLIの使用など、さまざまな方法でC/C++コードをスキャンできます。

C/C++プログラムのコードベースでは、開発者自身が書いたコードだけでなく、オープンソースライブラリから取り込んだコードもセキュリティ脆弱性の原因となる可能性があります。

最後に、インタラクティブにセキュリティを学べる、短く簡潔なSnyk LearnのC脆弱性に関する教材をぜひご覧ください。教材では、null dereference、double free、不適切なコーディング規約など、さまざまなC/C++の脆弱性を取り上げています。

最先端のインテリジェンスでコードを保護

わずか30分で、Snyk CodeのSAST機能を幅広くご紹介します。