Skip to content

Harden IDE lookup and WebFetch private-IP handling#14878

Closed
dev-shinyu wants to merge 4 commits intogoogle-gemini:mainfrom
dev-shinyu:shinyu/feat-secure-webfetch
Closed

Harden IDE lookup and WebFetch private-IP handling#14878
dev-shinyu wants to merge 4 commits intogoogle-gemini:mainfrom
dev-shinyu:shinyu/feat-secure-webfetch

Conversation

@dev-shinyu
Copy link

@dev-shinyu dev-shinyu commented Dec 10, 2025

Summary

Harden IDE CLI lookup and WebFetch private-IP checks to improve safety.

Changes

  • Use spawn-based command lookup (no shell interpretation) for IDE installers.
  • Rework private-IP detection (DNS + IPv4/IPv6 ranges) and make WebFetch fall back on internal URLs.
  • Add/update unit tests:
    • src/utils/fetch.test.ts
    • src/ide/ide-installer.test.ts
    • src/tools/web-fetch.test.ts
  • Run Vitest with the threads pool and log uncaught/unhandled errors in test workers.

Tests

  • npm run test --workspace @google/gemini-cli-core -- src/utils/fetch.test.ts src/ide/ide-installer.test.ts src/tools/web-fetch.test.ts
  • Result: pass (3 files, 53 tests). JUnit + coverage artifacts under packages/core.

@dev-shinyu dev-shinyu requested review from a team as code owners December 10, 2025 05:20
@google-cla
Copy link

google-cla bot commented Dec 10, 2025

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @dev-shinyu, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the security posture of the application by implementing safer command execution for IDE integrations and introducing a more robust private IP detection system for web fetching. These changes aim to mitigate risks associated with arbitrary command execution and prevent unintended access to internal network resources, ensuring a more secure and reliable operation.

Highlights

  • Enhanced Security for IDE CLI Lookup: The IDE CLI lookup mechanism has been hardened by switching from execSync to spawnSync for command execution, explicitly disabling shell interpretation to prevent potential command injection vulnerabilities.
  • Improved Private IP Detection for WebFetch: The isPrivateIp function has been completely reworked to include comprehensive detection of private IPv4 and IPv6 addresses, leveraging DNS resolution and standard private IP ranges. WebFetch operations will now fall back to internal URLs if a private IP is detected.
  • Updated Test Infrastructure: New unit tests have been added for the enhanced private IP detection logic, and existing tests for IDE installers and WebFetch have been updated to reflect the changes. Vitest is now configured to run tests in a threads pool and log uncaught exceptions/unhandled rejections for better debugging.
  • Dependency Management Updates: The package-lock.json file has been updated, primarily by adding or removing the peer: true flag for several dependencies, indicating adjustments in how peer dependencies are managed.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces significant security hardening for IDE command lookups and private IP detection in WebFetch. The move from execSync to spawnSync effectively mitigates command injection risks. The reworked private IP detection is much more robust, now including DNS resolution. However, I've found a critical issue in the new IPv4 address parsing logic that could lead to incorrect identification of private IPs, undermining the security improvements. My review includes a specific comment with a suggested fix for this issue.

Comment on lines 47 to 53
return parts.reduce((acc, part) => {
const num = Number(part);
if (Number.isNaN(num)) {
return NaN;
}
return (acc << 8) + num;
}, 0);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

security-critical critical

The use of the bitwise left-shift operator (<<) for converting an IP address to a number is incorrect and can lead to bugs. In JavaScript, bitwise operations are performed on signed 32-bit integers. This causes incorrect calculations for IP addresses where the numeric value would exceed 2^31 - 1 (e.g., any IP address starting with 128 or greater). As a result, private IP ranges like 192.168.0.0/16, 172.16.0.0/12, and 169.254.0.0/16 will not be correctly identified, which could expose internal services. Using multiplication instead of bitwise shifting will correctly handle the full range of unsigned 32-bit integer values for IPv4 addresses.

  return parts.reduce((acc, part) => {
    const num = Number(part);
    if (Number.isNaN(num)) {
      return NaN;
    }
    // Use multiplication to avoid signed 32-bit integer overflow with bitwise shifts.
    return acc * 256 + num;
  }, 0);

@gemini-cli gemini-cli bot added the status/need-issue Pull requests that need to have an associated issue. label Jan 7, 2026
@bdmorgan
Copy link
Collaborator

Hi @dev-shinyu, thank you so much for your contribution to Gemini CLI! We really appreciate the time and effort you've put into this.

We're making some updates to our contribution process to improve how we track and review changes. Please take a moment to review our recent discussion post: Improving Our Contribution Process & Introducing New Guidelines.

Key Update: Starting January 26, 2026, the Gemini CLI project will require all pull requests to be associated with an existing issue. Any pull requests not linked to an issue by that date will be automatically closed.

Thank you for your understanding and for being a part of our community!

@gemini-cli
Copy link
Contributor

gemini-cli bot commented Jan 24, 2026

Hi there! Thank you for your contribution to Gemini CLI.

To improve our contribution process and better track changes, we now require all pull requests to be associated with an existing issue, as announced in our recent discussion and as detailed in our CONTRIBUTING.md.

This pull request is being closed because it is not currently linked to an issue. You can easily reopen this PR once you have linked it to an issue.

How to link an issue:
Add a keyword followed by the issue number (e.g., Fixes #123) in the description of your pull request. For more details, see the GitHub Documentation.

Thank you for your understanding and for being a part of our community!

@gemini-cli gemini-cli bot closed this Jan 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status/need-issue Pull requests that need to have an associated issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants