> For the complete documentation index, see [llms.txt](https://sharpforce.gitbook.io/cybersecurity/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sharpforce.gitbook.io/cybersecurity/cve/2024/cve-2024-29415.md).

# CVE-2024-29415

> La **CVE-2024-29415** est une vulnérabilité de type Server-Side Request Forgery (SSRF) qui découle de la **CVE-2023-42282** mais qui a pourtant comme un effet de déjà vu.

## Description

* **Vendeur :** N/A
* **Produit :** ip (<https://github.com/indutny/node-ip/>)
* **Version(s) impactée(s) :** <= 2.0.1
* **Type de vulnérabilité :** Server-Side Request Forgery (SSRF) ([CWE-918 - Server-Side Request Forgery (SSRF)](https://cwe.mitre.org/data/definitions/918.html))

Le paquet ip, jusqu'à la version 2.0.1 pour Node.js, pourrait permettre une attaque de type SSRF (Server-Side Request Forgery), car certaines adresses IP (telles que 127.1, 01200034567, 012.1.2.3, 000:0:0000::01 et ::fFFf:127.0.0.1) sont incorrectement classées comme globalement routables par la fonction `isPublic()`. Cette vulnérabilité est due à une correction incomplète de la CVE-2023-42282.

<figure><img src="/files/9ESlh7obPDUnL08Cp1Pd" alt=""><figcaption></figcaption></figure>

## Préambule

Cette vulnérabilité fait directement suite à la [CVE-2023-42282](/cybersecurity/cve/2023/cve-2023-42282.md)comme étant une correction incomplète. Toutefois, la situation semble plus complexe qu'il n'y paraît, car la version 2.0.0 s'apparente davantage à un retour en arrière (et est donc similaire à la version 1.1.8), tandis que la version 2.0.1 semble implémenter le même correctif que la version 1.1.9.

## Analyse de la vulnérabilité

L'analyse de la version 2.0.0 révèle l'absence des modifications introduites dans la version 1.1.9. Ainsi, cette version se rapproche de la 1.1.8, à quelques différences près liées à la déclaration, à l'initialisation  ou à l'utilisation de certaines variables. Surtout, la fonction `isPrivate()`, et dans une moindre mesure `isPublic()`, ne bénéficient d'aucune correction :

```javascript
// Version 1.1.8
ip.isPrivate = function (addr) {
  return /^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i
    .test(addr)
    || /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i
      .test(addr)
    || /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^f[cd][0-9a-f]{2}:/i.test(addr)
    || /^fe80:/i.test(addr)
    || /^::1$/.test(addr)
    || /^::$/.test(addr);
};

ip.isPublic = function (addr) {
  return !ip.isPrivate(addr);
};
```

```javascript
// Version 2.0.0
ip.isPrivate = function (addr) {
  return /^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i
    .test(addr)
    || /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i
      .test(addr)
    || /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^f[cd][0-9a-f]{2}:/i.test(addr)
    || /^fe80:/i.test(addr)
    || /^::1$/.test(addr)
    || /^::$/.test(addr);
};

ip.isPublic = function (addr) {
  return !ip.isPrivate(addr);
};
```

Le listing complet des modifications peut être récupéré de la façon suivante :

```bash
sdiff -l node-ip-1.1.8/lib/ip.js node-ip-2.0.0/lib/ip.js | cat -n | grep -v -e '($'
```

La version 2.0.0 présente donc la même vulnérabilité que la version 1.1.8, liée à la CVE-2023-42282.

L'analyse de la version 2.0.1 met en évidence la même correction que celle apportée en version 1.1.9, tout en intégrant également les modifications liées à la définition, à l'initialisation et à l'utilisation des variables.

```javascript
// Version 1.1.9
ip.isPrivate = function (addr) {
  // check loopback addresses first
  if (ip.isLoopback(addr)) {
    return true;
  }

  // ensure the ipv4 address is valid
  if (!ip.isV6Format(addr)) {
    const ipl = ip.normalizeToLong(addr);
    if (ipl < 0) {
      throw new Error('invalid ipv4 address');
    }
    // normalize the address for the private range checks that follow
    addr = ip.fromLong(ipl);
  }

  // check private ranges
  return /^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i
      .test(addr)
    || /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^f[cd][0-9a-f]{2}:/i.test(addr)
    || /^fe80:/i.test(addr)
    || /^::1$/.test(addr)
    || /^::$/.test(addr);
};

ip.isPublic = function (addr) {
  return !ip.isPrivate(addr);
};
```

```javascript
// Version 2.0.1
ip.isPrivate = function (addr) {
  // check loopback addresses first
  if (ip.isLoopback(addr)) {
    return true;
  }

  // ensure the ipv4 address is valid
  if (!ip.isV6Format(addr)) {
    const ipl = ip.normalizeToLong(addr);
    if (ipl < 0) {
      throw new Error('invalid ipv4 address');
    }
    // normalize the address for the private range checks that follow
    addr = ip.fromLong(ipl);
  }

  // check private ranges
  return /^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i
      .test(addr)
    || /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^f[cd][0-9a-f]{2}:/i.test(addr)
    || /^fe80:/i.test(addr)
    || /^::1$/.test(addr)
    || /^::$/.test(addr);
};

ip.isPublic = function (addr) {
  return !ip.isPrivate(addr);
};
```

Ainsi, la version 2.0.1 présente les mêmes faiblesses que la version 1.1.9 en raison d'un correctif incomplet de la CVE-2023-42282.

## Ressources

* <https://nvd.nist.gov/vuln/detail/cve-2024-29415>
* <https://github.com/indutny/node-ip/tree/v2.0.0>
* <https://github.com/indutny/node-ip/tree/v2.0.1>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://sharpforce.gitbook.io/cybersecurity/cve/2024/cve-2024-29415.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
