<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Sat, 10 Oct 2026 23:09:07 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-107721</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-107721</link>
      <description>&lt;p&gt;fast-jwt provides fast JSON Web Token (JWT) implementation. Prior to 6.3.0, fast-jwt createVerifier accepts Infinity for clockTolerance because its option validation checks type and negativity but not finiteness. In validateClaimDateValue, infinite positive and negative modifiers make exp and nbf comparisons always pass, allowing expired or not-yet-active tokens to be accepted. The verifier cache also derives infinite bounds, so entries created under this configuration can remain valid until eviction. Exploitation requires an application administrator or equivalent configuration path to set clockTolerance to Infinity. This issue is fixed in version 6.3.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;fast-jwt provides fast JSON Web Token (JWT) implementation. Prior to 6.3.0, fast-jwt createVerifier accepts Infinity for clockTolerance because its option validation checks type and negativity but not finiteness. In validateClaimDateValue, infinite positive and negative modifiers make exp and nbf comparisons always pass, allowing expired or not-yet-active tokens to be accepted. The verifier cache also derives infinite bounds, so entries created under this configuration can remain valid until eviction. Exploitation requires an application administrator or equivalent configuration path to set clockTolerance to Infinity. This issue is fixed in version 6.3.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-107721</guid>
    </item>
    <item>
      <title>GHSA-687g-22h4-j4w4 — fast-jwt clockTolerance: Infinity silently bypasses both exp and nbf validation (and persists in the verifier cache)</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-687g-22h4-j4w4</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: fast-jwt&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`createVerifier({ clockTolerance: Infinity })` silently bypasses both `exp` (expiry) AND `nbf` (not-before) validation. Any expired or not-yet-active token is accepted as valid. The same primitive also corrupts the verifier&amp;#39;s internal cache so cached entries inherit infinite validity — they remain valid past a later developer-removed Infinity config until LRU eviction.&lt;/p&gt;
&lt;p&gt;## Vulnerable code&lt;/p&gt;
&lt;p&gt;`src/verifier.js:531-533` — option validation only rejects negative values, not Infinity:&lt;/p&gt;
&lt;p&gt;```js
if (clockTolerance &amp;amp;&amp;amp; (typeof clockTolerance !== &amp;#39;number&amp;#39; || clockTolerance &amp;lt; 0)) {
  throw new TokenError(TokenError.codes.invalidOption, &amp;#39;The clockTolerance option must be a positive number.&amp;#39;)
}
```&lt;/p&gt;
&lt;p&gt;`Infinity` passes (it&amp;#39;s a number, not less than 0, truthy).&lt;/p&gt;
&lt;p&gt;`src/verifier.js:583-602` — clockTolerance flows into the date-claim validators:&lt;/p&gt;
&lt;p&gt;```js
if (!ignoreNotBefore) {
  validators.push({ ..., modifier: -clockTolerance })   // → -Infinity
}
if (!ignoreExpiration) {
  validators.push({ ..., modifier: +clockTolerance })   // → Infinity
}
```&lt;/p&gt;
&lt;p&gt;`src/verifier.js:198-205` — applies modifier additively, producing always-pass comparisons:&lt;/p&gt;
&lt;p&gt;```js
function validateClaimDateValue(value, modifier, now, greater, errorCode, errorVerb) {
  const adjusted = value * 1000 + (modifier || 0)   // → ±Infinity
  const valid = greater ? now &amp;gt;= adjusted : now &amp;lt;= adjusted   // → always true
  ...
}
```&lt;/p&gt;
&lt;p&gt;## Empirical PoC&lt;/p&gt;
&lt;p&gt;```js
const { createSigner, createVerifier } = require(&amp;#39;fast-jwt&amp;#39;)
const secret = &amp;#39;t…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: fast-jwt&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`createVerifier({ clockTolerance: Infinity })` silently bypasses both `exp` (expiry) AND `nbf` (not-before) validation. Any expired or not-yet-active token is accepted as valid. The same primitive also corrupts the verifier&amp;#39;s internal cache so cached entries inherit infinite validity — they remain valid past a later developer-removed Infinity config until LRU eviction.&lt;/p&gt;
&lt;p&gt;## Vulnerable code&lt;/p&gt;
&lt;p&gt;`src/verifier.js:531-533` — option validation only rejects negative values, not Infinity:&lt;/p&gt;
&lt;p&gt;```js
if (clockTolerance &amp;amp;&amp;amp; (typeof clockTolerance !== &amp;#39;number&amp;#39; || clockTolerance &amp;lt; 0)) {
  throw new TokenError(TokenError.codes.invalidOption, &amp;#39;The clockTolerance option must be a positive number.&amp;#39;)
}
```&lt;/p&gt;
&lt;p&gt;`Infinity` passes (it&amp;#39;s a number, not less than 0, truthy).&lt;/p&gt;
&lt;p&gt;`src/verifier.js:583-602` — clockTolerance flows into the date-claim validators:&lt;/p&gt;
&lt;p&gt;```js
if (!ignoreNotBefore) {
  validators.push({ ..., modifier: -clockTolerance })   // → -Infinity
}
if (!ignoreExpiration) {
  validators.push({ ..., modifier: +clockTolerance })   // → Infinity
}
```&lt;/p&gt;
&lt;p&gt;`src/verifier.js:198-205` — applies modifier additively, producing always-pass comparisons:&lt;/p&gt;
&lt;p&gt;```js
function validateClaimDateValue(value, modifier, now, greater, errorCode, errorVerb) {
  const adjusted = value * 1000 + (modifier || 0)   // → ±Infinity
  const valid = greater ? now &amp;gt;= adjusted : now &amp;lt;= adjusted   // → always true
  ...
}
```&lt;/p&gt;
&lt;p&gt;## Empirical PoC&lt;/p&gt;
&lt;p&gt;```js
const { createSigner, createVerifier } = require(&amp;#39;fast-jwt&amp;#39;)
const secret = &amp;#39;t…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-687g-22h4-j4w4</guid>
    </item>
  </channel>
</rss>
