AIコーディング入門 番外編:オープンソースソフトウェアのサプライチェーン攻撃とタイポの落とし穴

Share

Security NEWS TOPに戻る
バックナンバー TOPに戻る

AIコーディング入門番外編アイキャッチ画像(OSSのサプライチェーン攻撃)

AIを活用したコーディングが普及する一方で、オープンソースソフトウェア(OSS)を狙ったサプライチェーン攻撃が増加しています。特に、開発者のタイポを悪用する「Typosquatting」や、AIのハルシネーションに便乗する「Slopsquatting」といった手法は、身近で深刻な脅威です。本記事では、実例を交えながらその仕組みとリスクを解説し、安全なAIコーディングを実践するためのポイントを紹介します。

コードを書く人やインフラストラクチャの構築をする人ならば、人生で最低でも一度は経験しているであろうこと、それはタイプミス、いわゆるタイポ(typo)ではないでしょうか。タイポ、些細なミスで、日常的に発生するものなのですが、中には重大なものもあります。

タイプミスが招く落とし穴 ─ Typosquattingとは

皆さんは「タイポスクウォッティング」という言葉をご存じでしょうか。Web関連のお仕事をされている方であれば、URLのタイポスクウォッティング、つまり間違いやすい・紛らわしいURLでユーザーをおびき寄せる手法としてのタイポスクウォッティングをご存じの方も多いかと思います。この手法がオープンソースソフトウェアでも昨今使用されるようになっています。

例えばnpmの場合、

npm install package_name

と入力することでパッケージのインストールを実行できます。インストールしたパッケージは例えばjavascript(react)を利用している環境であれば

import {
コンポーネント名
} from “@/fullpath/to/package_name”;

の形でコードの先頭で利用するパッケージ名を宣言します。

世の中にはこのパッケージ名のよくあるタイプミス(typo)を狙って作られたマルウェアの一種が存在します。そんなマルウェア、何のためにあるのだろうという方も多いと思いますが、例えば暗号資産のウォレットを狙ったマルウェアや、システムへの侵害目的のマルウェアなどが最近では話題になっています。

npmやPythonなどOSSでの事例

暗号資産を狙うマルウェアの脅威

暗号資産を狙ったマルウェアについては偽の採用面接中に実行を求められるケースも報告されています。

Socket,[Another Wave: North Korean Contagious Interview Campaign Drops 35 New Malicious npm Packages]https://socket.dev/blog/north-korean-contagious-interview-campaign-drops-35-new-malicious-npm-packages

偽の採用プロセスとソーシャルエンジニアリング

採用面接に至るということは例えば採用条件面で魅力的である、採用プロセスに見せかけたフェーズで偽の採用者に対して高い信頼を持つよう誘導されている、著名な企業などに成りすますことで権威性・信憑性を信じさせられる、オンライン環境による信頼レベルを悪用される、といったソーシャルエンジニアリングの基本ともいえる「人」が抱える脆弱性をすでに悪用された状態です。

関連記事:
ソーシャルエンジニアリング最前線【第1回】ソーシャルエンジニアリングの定義と人という脆弱性」(https://www.sqat.jp/kawaraban/37089/

その状態で、面接というストレスのかかる、失敗が許されないと思ってしまう状況で紛らわしい名称の不正なコードや、不正なパッケージを含むコードを実行させられた場合、気づくことは容易ではありません。面接で突然コードを実行させられることに違和感を覚えてその場を退出することが最善かもしれませんが、Zoomのリモートコントロール機能を使ってマルウェアを実行するケースもあることから、特にすべてをオンラインで完了させるタイプの採用プロセスそのものに対して常に疑わしいかどうか疑問を持ち続けるしか対策はないかもしれません。

Zoomのリモートコントロール攻撃

参考情報:

The Trail of Bits Blog,[Mitigating ELUSIVE COMET Zoom remote control attacks](https://blog.trailofbits.com/2025/04/17/mitigating-elusive-comet-zoom-remote-control-attacks/

なお、昨年末に警察庁・内閣サイバーセキュリティセンター・金融庁連名で偽の採用試験関連で注意喚起が出ています。今一度ご確認ください。

警察庁/内閣サイバーセキュリティセンター/金融庁「北朝鮮を背景とするサイバー攻撃グループ TraderTraitor によるサイバー攻撃について (注意喚起)」(令和6年12月24日)(https://www.npa.go.jp/bureau/cyber/pdf/20241224_caution.pdf

タイポよりも怖い?生成AI時代の新たな罠 ─ Slopsquatting

生成AIやAIエージェントの普及でAIを使用したコーディングを行う人も増えていると思います。「typoもないし、いいじゃない?」と思う方も多いと思いますが、生成AIには「ハルシネーション」という最大の難点があります。人間のtypoぐらいの頻度で遭遇する現象の一つといっても言い過ぎではないかもしれません。そんなハルシネーションを狙って、偽のパッケージが用意されていたら?という内容のレポートが公開されました。

参考情報:

トレンドマイクロ株式会社「スロップスクワッティング:AIエージェントのハルシネーションにつけ込む攻撃手法」(https://www.trendmicro.com/ja_jp/research/25/g/slopsquatting-when-ai-agents-hallucinate-malicious-packages.html

生成AI単体には生成内容の検証メカニズムがありません。このため、AIエージェントを利用したコーディングの場合はエージェント側の機能として備わっている検証機能を利用することが必要です。具体的な手法はレポートにも記載がありますが、日進月歩で新たな機能が登場する現状では最新の情報も併せて探すことをお勧めします。 また、エージェントを用いない場合も含めて、以下のようなリスク回避策を基本とするのもよいかもしれません。

  • 参照するパッケージ・モジュールを限定して、typosquattingやslopsquattingなどのリスクを回避する
  • やむを得ず新しいパッケージ・モジュールをインストールする場合は人の手を介したチェックを行うことで、リスクを抑制する

実際に筆者もプロンプトで利用パッケージを限定していますが、特に利便性の阻害を感じたことはありません。また、周囲とのコミュニケーションでパッケージ・モジュールの情報の交換、推奨などの情報を得ることも多くあり、AI時代のコーディングとはいえコミュニケーションも併せて重要であることを実感しているところです。

プロンプトエンジニアリングと検証の重要性

前出のレポートで指摘されている原因の一つにはプロンプトの一貫性やあいまいさといった自然言語による指示ならではの問題があります。プロンプトエンジニアリングなどについては以下の記事でもご紹介しています。ただし、モデル側の実装状況などによりユーザー側の努力の反映には限界があるため、必ず生成結果に対する人のチェック(一種のHuman in the Loop)はプロセスとして欠かさないことが望まれます。

関連記事:
AIコーディング入門 第1回:Vibeコーディングとプロンプトエンジニアリングの基礎」(https://www.sqat.jp/kawaraban/38067/

正規リポジトリの乗っ取りという最大の脅威

2025年7月、npmの開発者をターゲットにしたフィッシングが報告されました。この後、複数のパッケージの乗っ取りが報告されています。

npm開発者を狙ったフィッシング事例

オープンソースソフトウェア(OSS)経由のサプライチェーン攻撃

ここまででお気付きの方も多いと思いますが、今回取り上げた様々な攻撃手法はすべてオープンソースソフトウェア経由のサプライチェーン攻撃として、1つにまとめることができます。プログラミング言語の多く、そしてWebサイトの構築に用いられるJavaScriptのフレームワークの多くはオープンソースソフトウェアとして流通しています。プログラミング言語やJavaScriptのフレームワークは実際に利用するにあたって利便性を向上させる目的で多くのパッケージやモジュール、ライブラリなどがオープンソースとして開発・公開されています。これらのオープンソースソフトウェアは現在では多くが多数のコントリビューターとメンテナーによってGitHub上で公開され、開発が行われています。GitHubからnpmなどのパッケージ管理システムへの公開も一貫して行うことができるため、非常に利便性が高い反面、今までに挙げたような攻撃を仕掛けるための利便性も高くなっています。また、オープンソースソフトウェアは相互に依存性を持つことが多いことから、人気のあるモジュール・パッケージへの攻撃が多数のモジュール・パッケージやシステムへ影響を及ぼすことができます。これが、オープンソースソフトウェアへのサプライチェーン攻撃における最大の特徴ともいえるかもしれません。オープンソースソフトウェアを利用する以上、こういったリスクがあることは十分理解したうえで利用する必要があります。

オープンソースソフトウェアの利用の条件としてセキュリティ面でかなりハードルが高いのは事実ですが、一方で利便性・柔軟性・モダンなシステムの構築といった観点からオープンソースソフトウェアを全く利用しない(プロプライエタリソフトウェアだけで構築する)というのは難しいという現状に鑑みるとやむを得ない選択であるとも言えます。

開発者がとるべき対策

こういったケースに対応するには依存関係のチェックや追跡、SBOMによる管理が必要になります。依存関係のチェックや追跡にはGitHubを使用している場合ならばDependabotの利用、その他のコードレポジトリを対象とする場合は各種の依存関係トラックツールを使用する必要があります。SBOMで自身のコードのコンポーネントと依存関係の管理を合わせて行うことで、システム全体としての管理を行うことが求められます。

まとめ ― AI時代のオープンソースソフトウェア利用に求められる視点

タイプミスを悪用した Typosquatting、AIのハルシネーションに便乗する Slopsquatting、さらには正規リポジトリの乗っ取りといった攻撃は、いずれもオープンソースソフトウェアを媒介とするサプライチェーン攻撃として位置づけられます。これらは利便性と引き換えに大きなリスクを伴い、暗号資産の窃取やシステム侵害といった深刻な被害へとつながりかねません。OSSの依存関係は複雑で、人気パッケージが狙われることで広範囲に影響が及ぶことも少なくありません。そのため、参照パッケージを限定する運用、人による確認(Human in the Loop)、Dependabotなどの依存関係管理ツールの活用、SBOMによる包括的なコンポーネント管理 といった対策が不可欠です。AIを活用したコーディングが普及する中でも、「便利だから任せる」のではなく、常に検証と疑問を持ち続ける姿勢 が求められます。セキュリティと利便性の両立こそが、これからのOSS利用とAI開発における鍵といえるでしょう。


Security NEWS TOPに戻る
バックナンバー TOPに戻る

ウェビナー開催のお知らせ

  • 2025年9月24日(水)12:50~14:00
    製造業・自動車業界のためのサプライチェーン対策 -攻撃事例から学ぶ企業を守るセキュリティ強化のポイント-
  • 2025年10月1日(水)13:00~14:00
    2025年10月Windows10サポート終了へ 今知るべきサポート切れのソフトウェアへのセキュリティ対策ガイド
  • 2025年10月8日(水)14:00~15:00
    「ソースコード診断で実現する安全な開発とは?脆弱性対策とDevSecOps実践」
  • 最新情報はこちら


    資料ダウンロードボタン
    年二回発行されるセキュリティトレンドの詳細レポート。BBSecで行われた診断の統計データも掲載。
    お問い合わせボタン
    サービスに関する疑問や質問はこちらからお気軽にお問合せください。

    Security Serviceへのリンクバナー画像
    BBsecコーポレートサイトへのリンクバナー画像
    セキュリティ緊急対応のバナー画像

    プログラミング言語の脆弱性対策を考える

    Share

    Security NEWS TOPに戻る
    バックナンバー TOPに戻る

    プログラミング言語のセキュリティは、組織のシステム全体のセキュリティに大きな影響を与えます。「アプリケーションの脆弱性の半数はC/C++に起因する」という報告もあり、プログラミング言語における脆弱性の特徴を理解し、適切な対策を講じることは、いまや組織のセキュリティに不可欠な取り組みといえます。本記事では、プログラミング言語の最新動向、脆弱性が生まれる背景を解説します。

    プログラミング言語のトレンド

    言語 使用している
    開発者の比率
    JavaScript69.7%
    HTML/CSS 62.4%
    SQL 56.9%
    Python 41.6%
    Java 38.4%
    Bash/Shell/PowerShell 34.8%
    C# 32.3%
    TypeScript 28.3%
    PHP 25.8%
    C++20.5%
    C 18.2%
    Go 9.4%
    Kotlin8.0%
    言語 使用している
    開発者の比率
    Ruby7.5%
    VBA6.2%
    Swift6.1%
    R5.5%
    Assembly4.9%
    Rust4.8%
    Objective-C4.4%
    Scala3.9%
    Dart3.7%
    Perl3.3%
    Haskell1.8%
    Julia0.9%

    Stack Overflow Developer Survey 2020 より弊社作成
    https://insights.stackoverflow.com/survey/2020#technology-programming-scripting-and-markup-languages-professional-developers

    JavaScript、HTML/CSS、SQLなどが上位に並んでいますが、皆さんの予想どおりでしょうか?ちなみに冒頭で述べた、「脆弱性の半数」を生み出すとされるC/C++に関しては、昨今IoTデバイスなどの組込機器やデスクトップアプリケーション等に利用目的が収れんしてきているといわれ、その使用率は減少傾向にあります。また、リストには記載がありませんが、日本に限ってみると、COBOLなどのレガシーシステム向けの言語がいまだ根強いシェアを保っているのはご存じの方も多いことでしょう。

    なお、弊社での診断傾向としては、JavaScriptのほか、Pythonが目立っています。今後については、「オーバーヘッドが少なく、静的型付け言語である」という特徴をもつTypeScriptなどが、軽量さの望まれるサーバレス環境での需要につながるものとみられます。また、Android端末向けにKotlinの需要も高まると予測しています。以下、ご参考に、プログラミング言語と主な利用分野のマッピングを示します。

    図:主要プログラミング言語と現在利用されている代表的分野

    プログラミング言語の脆弱性 ― 言語ごとに異なる特徴を知る

    プログラミング言語の脆弱性を考える場合、特定の言語に固有のものと、言語間で共通のものを押さえておく必要があります。

    例えば、C/C++では、その脆弱性の7割がメモリハンドリングのミスに起因するといわれており、メモリ関連処理のロジックを正しく制御させ、ソースコード内に脆弱性を作りこまないようにすることが、重要なセキュリティ対策となります。そのほか、言語固有の脆弱性として代表的なものは、Javaでの「安全でない入力に対するデシリアライゼーション」の問題、JavaScriptでの「パストラバーサル」や「暗号」の問題、PHPでの「クロスサイトスクリプティング(XSS)」や「SQLインジェクション」などになります。

    なお、2000年代後半以降にリリース開始された比較的新しいプログラミング言語(Kotlin、Golang、Rustなど)については、上記とは若干が異なる観点からの注意が必要です。まず、こうした言語では、セキュアコーディングのための様々な関数やライブラリなどが用意され、セキュリティに関する手厚い対策が組み込まれているのですが、その一方で、セキュリティの機能が増えれば増えるほど関連ドキュメントが膨大になり、把握が追いつかないという課題が生じています。例えば、Kotlinの場合、Kotlin自体のドキュメンテーションではセキュリティ関連の記述はNULLの安全性に触れる程度なのですが、セキュアコーディングに取り組もうとすると、膨大なAndroid Developer Guideを参照する必要があります。また、相互運用性への配慮も必要です。例えばKotlinやGolangはJavaと一緒に利用するケースが多いため、こうした言語で開発を行う場合には、Java側の環境を考慮したうえでのセキュアコーディングが不可欠になり、それが開発の難易度を押し上げているという状況があります。

    プログラミング言語の脆弱性 ― 全言語に共通の特徴を知る

    続いては、すべての言語に共通する脆弱性です。これは大きく以下の3つに分類できます。

    情報漏洩
    ・表示する必要のない機微な情報(ユーザ名やIDなど)の露呈
    ・不要なシステム情報の公開
    入力検証の不備
    ・不正なパラメータの許容、XSS、SQLインジェクション
    ・HTTPヘッダ分割
    認可・認証関連の脆弱性
    ・オブジェクトやファイルなどへのアクセス認可の不備
    ・認証情報の保護機構や暗号化の不備

    脆弱性が発生する背景

    以上述べてきたような脆弱性は、なぜ発生するのでしょう。その背景には、開発現場における以下のような課題があると考えられます。

    ・プロジェクトベースで人員が変わることが多く、知識や経験の共有が行われることがまれ
    ・脆弱性やセキュアコーディングに対する意識、知識レベルがプログラマによって異なる
    ・ギリギリのスケジュールでプロジェクトが進むことが多く、知識や経験の共有まで手が回らない
    ・セキュリティへの対応が明示的な業務として遂行されるのではなく、プログラマやプロジェクトメンバー1人1人の善意に依存する面が強い

    具体例で説明しましょう。先ほど、PHPではXSSやSQLインジェクション等の脆弱性がよく見られると述べました。しかし、PHPでも、バージョン4以降であれば「htmlspecialcharacters」という関数を利用することでXSSの回避に必要な特殊文字のエスケープ処理ができます。SQLインジェクションについても、プレースホルダの利用による回避が可能です。このように、すでに対策が存在する場合であっても、プログラマ間で知識や経験の共有が行われていない場合、ソースコード診断やステージング環境でのWebアプリケーション脆弱性診断が実施されない限り、脆弱性は放置されることになります。また、「機微な情報の露呈」という問題については、個人情報保護などの法制度に対する知識が共有されておらず、そもそも課題として認識されていないという可能性があります。なお、知識共有のハードルは、セキュリティ機能が充実しているゆえに把握すべき情報量が膨大で、他の言語との互換性等まで含めた配慮が求められる最近のプログラミング言語では、さらに高いといえるでしょう。

    こうした課題を解決するには、プログラマ個人の知識・技術レベルを高めることはもちろんですが、それ以上に重要なのは、組織を挙げての体系的な取り組みであるといえます。

    先手を打った対処がカギ

    そこでぜひ取り入れたいのが、プログラミング言語に関わる脆弱性が生じていないかを、開発の初期段階から継続的に点検する取り組みです。これは「DevSecOps」とも呼ばれる考え方で、「開発(Dev)」・「運用(Ops)」に「セキュリティ(Sec)」の観点を組み込むことで、システムのセキュリティ強化を図るものです。開発プロジェクトは常に時間との闘いですが、だからといって脆弱性への対応を先送りしてはなりません。対処が事後になればなるほど、影響範囲が広がり、コストも肥大する恐れがあります。

    以前の記事でも解説しましたが、何よりも、初期段階からの取り組みが重要です。例えば、人員の流動が激しいプロジェクトベースの現場では、開発の早期からソースコード診断を含むテスト活動を実施し、脆弱性をコード単位で効率的に解消していくことによって、各段階で積み上げられた知識や経験を、後続の工程で活用することが可能になります。また、近年主流になっているアジャイル型の開発手法でもこれは有効で、短い開発サイクルが繰り返される中で早期に・こまめにテストや修正を行うようにすることで、セキュリティを強化できるのみならず、プロジェクト全体の工数も抑制できます。なお、短いサイクルでテストを回すには、SaaSタイプのソースコード診断サービスの利用を検討してもよいでしょう。

    先手を打って脆弱性に対処できれば、脆弱性の要因となっていた様々な課題に取り組む余裕も生まれます。結果として、セキュリティと開発効率をともに高められる好循環を実現できるのではないでしょうか。

    Security NEWS TOPに戻る
    バックナンバー TOPに戻る


    資料ダウンロードボタン
    年二回発行されるセキュリティトレンドの詳細レポート。BBSecで行われた診断の統計データも掲載。
    お問い合わせボタン
    サービスに関する疑問や質問はこちらからお気軽にお問合せください。

    Security Serviceへのリンクバナー画像
    BBsecコーポレートサイトへのリンクバナー画像
    セキュリティ緊急対応のバナー画像
    セキュリティトピックス動画申し込みページリンクへのバナー画像