In this article
Gemini Code Assistで安全なコードを生成する
GoogleがリリースしたGemini Code Assistは、日々のプログラミング作業に活用できるIDE向けのコーディング支援ツールです。LLMが安全なコードを生成するには、どうすればよいのでしょうか?
Gemini Code Assistのシンプルなインターフェースは、率直に言って気に入っています。余計なボタンもなく、とても分かりやすいデザインです。画面を広く使え、チャット体験を最大限に活かしながら、エージェント型のコーディング作業に集中できます。また、処理の流れ全体を通じて、推論の詳細も分かりやすく表示されます。
Gemini Code Assistにコーディングタスクを与え、LLMを活用したコーディングの仕組みと、SnykがGenAIコードの保護にどのように役立つかを見てみましょう。
AI生成コードを保護する、このステップバイステップのチュートリアルに必要なもの:
VS Code(無料!)
GoogleのGemini Code Assist(無料!)
VS Codeのユーザー設定に次のディレクティブを追加して、Gemini Code Assistの「Insiders」モードを有効にしてください:
"geminicodeassist.updateChannel":"Insiders",
Snyk CLI(無料!)
Snyk VS Code IDE拡張機能(無料!)
Node.jsでユーザープロフィール画像を安全に保存する方法
Expressウェブフレームワークを使用し、MongoDBデータベースとHandlebarsテンプレートエンジンを組み込んだ、動作するNode.jsアプリケーションをすでに用意しています。
index.js内のroutes/ファイルには、save_account_detailsというルートハンドラーが含まれています。このハンドラーは、ユーザーのアカウント情報をプロフィールに保存し、その情報をユーザーに表示する処理をすでに行っています。
Node.jsサーバー上のJavaScriptコードは次のとおりです。
exports.save_account_details = function(req, res, next) {
// get the profile details from the JSON
const profile = req.body
// validate the input
if (validator.isEmail(profile.email, { allow_display_name: true })
// allow_display_name allows us to receive input as:
// Display Name <email-address>
// which we consider valid too
&& validator.isMobilePhone(profile.phone, 'he-IL')
&& validator.isAscii(profile.firstname)
&& validator.isAscii(profile.lastname)
&& validator.isAscii(profile.country)
) {
// trim any extra spaces on the right of the name
profile.firstname = validator.rtrim(profile.firstname)
profile.lastname = validator.rtrim(profile.lastname)
// render the view
return res.render('account.hbs', profile)
} else {
// if input validation fails, we just render the view as is
console.log('error in form details')
return res.render('account.hbs')
}
}ご覧のとおり、validator npmパッケージを使って、メールアドレスなどのプロフィールデータがスキーマに沿っているかを確認するバリデーションが多数実装されています。現時点ではデータベースへのデータ保存はまだ行っていませんが、それは後で取り組めます。
この機能を拡張し、ユーザーがアバターなどのプロフィール画像のURLを指定できるようにして、その画像をダウンロードしてディスクに保存し、使いやすさを向上させるにはどうすればよいでしょうか?
GenAIコーディングタスク:ユーザーのアバターでプロフィールを更新する
Node.jsでネットワークリクエストやファイルシステムAPIを使い、リモートURLから画像を取得してディスクに保存する方法が分からない場合は、このコーディングタスクにGemini Code Assistを使ってみましょう。
VS Codeの拡張機能タブを開き、Gemini Code Assistに次のように指示します。
Let's update the save_account_details function handler so that it takes the URL provided in the req.body.profile_picture_url property, downloads the file to the uploads/ directory and saves it to diskGemini Code Assistでコードを更新する一連の流れを動画でご覧ください。

モデルが生成したコードは次のとおりです。どう思いますか?
exports.save_account_details = function(req, res, next) {
// get the profile details from the JSON
const profile = req.body
// validate the input
if (validator.isEmail(profile.email, { allow_display_name: true })
// allow_display_name allows us to receive input as:
// Display Name <email-address>
// which we consider valid too
&& validator.isMobilePhone(profile.phone, 'he-IL')
&& validator.isAscii(profile.firstname)
&& validator.isAscii(profile.lastname)
&& validator.isAscii(profile.country)
) {
// trim any extra spaces on the right of the name
profile.firstname = validator.rtrim(profile.firstname)
profile.lastname = validator.rtrim(profile.lastname)
if (profile.profile_picture_url) {
const localPath = path.join(__dirname, '../public/uploads/');
if (!fs.existsSync(localPath)) {
fs.mkdirSync(localPath)
}
const localFile = fs.createWriteStream(path.join(localPath, path.basename(profile.profile_picture_url)));
const protocol = profile.profile_picture_url.startsWith('https') ? https : http;
protocol.get(profile.profile_picture_url, function(response) {
response.pipe(localFile);
localFile.on('finish', function() {
localFile.close();
// render the view
return res.render('account.hbs', profile)
});
}).on('error', function(err) {
fs.unlink(localPath);
console.log('error in form details')
return res.render('account.hbs')
});
} else {
// render the view
return res.render('account.hbs', profile)
}
} else {
// if input validation fails, we just render the view as is
console.log('error in form details')
return res.render('account.hbs')
}
}上記のJavaScriptコードは、コードのハイライト表示がないと少し分かりにくいかもしれません。IDEで整形された同じ結果を見てみましょう。問題点に気づきましたか?脆弱性はいくつ見つかりましたか?

Snyk AI Trustの名にふさわしく、Gemini Code Assistを保護
日々の作業にすでに取り入れられているLLMやエージェント型ワークフローは、さまざまな形でセキュリティリスクを生み出す可能性があります。
セキュリティリスクの一つは、GenAIコーディングアシスタントが、攻撃者に悪用される可能性のある安全でないコードを生成することです。上記の手順は、AIを信頼することで潜むセキュリティ脆弱性をよく示しています。Snykはそのリスクを軽減し、生成されたコードを監視して修正できるよう支援します。
Gemini Code Assistによる変更後にファイルを保存すると、VS Code IDEにすでにインストールされているSnyk Security拡張機能が起動し、変更されたファイルをスキャンします。そして、脆弱なコードを検出すると、開発者に知らせるおなじみの赤い波線で強調表示します。

たった1行のコードが、2種類の脆弱性リスクを生み出しています。
ユーザーが指定したURLからデータを取得していますが、HTTPSではなくHTTPのリモートエンドポイントに接続してしまう可能性があります。そのためSnykは、機密情報が平文で送信されるおそれのある、安全でないプロトコルの使用を警告しています。このセキュリティリスクについては、Snyk LearnのCookie内の機密情報の平文保存で詳しく解説しています。Cookieを例に説明しています。
さらに、ユーザーが制御するURLに対して、検証もせずにHTTPリクエストを送信しています。指定された画像URLが、社内ネットワークや開発者のローカルマシン上にあるhttp://127.0.0.1:8080/admin_get_resourcesのような内部リソースだったらどうでしょうか?これはSSRFの脆弱性です。このトピックについても、リスクと緩和策を詳しく学べるSnyk Learnのクイックレッスンがあります。サーバーサイドリクエストフォージェリ(SSRF)
では、AIコーディングアシスタントの使い方を改善して、最初から安全なコードを生成できるでしょうか?続きをご覧ください。
MCP経由でGemini Code AssistとSnykを連携し、安全なエージェント型ワークフローを実現
Gemini Code AssistはエージェントモードでModel Context Protocol(MCP)をサポートしています。つまり、他のインテグレーションにMCPツールリクエストを送信し、その応答をもとにモデルの生成結果を調整できます。
SnykもMCPをサポートしています。そのため、オープンソースの依存関係のスキャンや、LLMが生成した安全でないコードのスキャンなどのツールをLLMに提供できます。詳しくは、Snyk MCPのデモをご覧ください。
Gemini Code AssistのMCP設定を更新して、Snykを実行できるようにしましょう。.gemini/settings.jsonファイルを作成し、次の内容を追加します。
{
"mcpServers": {
"snyk": {
"command": "snyk",
"args": [
"mcp",
"-t",
"stdio",
"--experimental"
]
}
}
}まだインストールしていない場合は、Snyk CLIをインストールしてください。
npm install -g snyk@latest次に、以下のコマンドを実行して認証し、表示される手順に従ってログインします。
snyk authすべてが正常に動作していることを確認するため、簡単なプロンプトでGeminiに尋ねてみましょう。

これでGemini Code AssistとSnykを連携し、最初に行ったものとまったく同じタスク、つまりユーザーが指定したURLの画像をディスクに保存するコード生成の結果をテストできることが分かりました。
プロンプトはこちらです。これで準備完了です。

Gemini Code Assistがコードを生成する間、LLMがコードを生成・更新するたびにSnyk MCPサーバーを呼び出してコードをテストし、脆弱性がないことを確認します。

コーディングセッションは約10分続き、Gemini Code AssistとSnykの間で何度かやり取りがありました。安全なコードを書くことがいかに複雑かがよく分かります。全編はこちらをご覧ください。

GenAIコードを保護するSnyk AI Trust
GenAIコードの保護についてさらに知りたい方には、次のリソースをおすすめします。
バイブコーディングをしていますか?安全でないコーディングには注意が必要です。実例をぜひご覧ください。Node.jsでバイブコーディングしたファイルアップロードAPIにセキュリティ脆弱性が発生
MCPを初めて使いますか?MCPアーキテクチャを視覚的に理解するための入門ガイド
MCPセキュリティについて知りたい方は、こちらをご覧ください。MCPセキュリティ:古くて新しい課題