ãã°ã€ã³ããã«ç®¡çè ã«ãªãã â Math.random() ã§çœ²åããã¯ãããŒãåœé ãããHFSã®è匱æ§
ãã®èšäºã¯æç¹ã®ãã¥ãŒã¹ã§ããçŸåšã®æäŸç¶æ³ãšã¯ç°ãªãå ŽåããããŸãã誀ãã®èšæ£ã¯éæè¡ããŸãã
ãã³ã®ã³å
çããã¡ã€ã«å
±æãœããã®è匱æ§ã§ããã°ã€ã³ããªããŠã管çè
ã«ãªãããã£ãŠæ¬åœãªã®ïŒ
Rejetto HFSãšãããã¡ã€ã«å
±æãµãŒããŒã® CVE-2026-61500 ã ãã圱é¿ãåããã®ã¯3.0.0ã3.2.0ã§ãä¿®æ£çã®3.2.1ã¯2026幎7æ13æ¥ã«ããå
¬éãããŠãããVulnCheckã®è©äŸ¡ã§ã¯CVSS 4.0ã§9.3ã®ãCriticalãã ãããããŠ2026幎9æ30æ¥ã«ãçºèŠè
ãæ»ææé ã®è©³çްãå
¬éãããã ã
ãããã7æã«åºãŠããªããããå®å¿ãªããããªãã®ïŒ
åœãŠãŠããã°ãã7æã®ä¿®æ£ã®ãç¥ããã«ã¯ãéå»ã®ãã¹ãŠã®ããŒãžã§ã³ã§è€æ°ã®è匱æ§ãèŠã€ãããæ»æè
ãHFSã®ç®¡çè
ã¢ã¯ã»ã¹ãåŸãããå¯èœæ§ãããããšæžãããŠããã ãã§ãä»çµã¿ã¯äŒããããŠãããããã9æ30æ¥ã«æé ããšå
¬éãããããããŸã æŽæ°ããŠããªããµãŒããŒã¯å°å³ãé
ãããç¶æ
ã«è¿ããã ãããããã®ãœããã¯æããçãããŠããŠãCISAã®ãæªçšã確èªãããè匱æ§ãã«ã¿ãã°ã«ã¯HFSã®å€ãè匱æ§ã2ä»¶ââ2022幎3æ25æ¥è¿œå ã®CVE-2014-6287ãšã2024幎7æ9æ¥è¿œå ã®CVE-2024-23692ââãã§ã«èŒã£ãŠãããåŸè
ã¯ã©ã³ãµã ãŠã§ã¢ã§ã®æªçšããKnownïŒç¢ºèªæžã¿ïŒããšèšé²ãããŠãããã
ããã§ãã©ããã£ãŠãã°ã€ã³ãªãã«ç®¡çè
ã«ãªãã¡ããã®ïŒ
éµã®äœãæ¹ãåºçºç¹ãªãã ãHFSã®3.xç³»ã¯Node.jsã§æžãããŠããŠãKoaãšãããã¬ãŒã ã¯ãŒã¯ã®ã»ãã·ã§ã³æ©èœã䜿ã£ãŠãããã»ãã·ã§ã³ã®ã¯ãããŒã¯keygripãšããä»çµã¿ã§çœ²åããããã ãã©ããã®çœ²åéµãJavaScriptã® Math.random() ããäœã£ãŠãããèµ·åæã® randomId(30) ãšããåŠçã Math.random() ãã¡ããã©3ååæ¶è²»ããŠãããã眲åéµã«ãªã£ãŠãããã ãã
Math.random() ã£ãŠã©ã³ãã ãªæ°ãåºããã§ããïŒãããããã¡ãªã®ïŒ
ãã°ãããŠãããããšãšãäºæž¬ã§ããªããããšã¯å¥ãªãã ãNode.jsãChromeã®äžèº«ã§ããV8ã¯ãMath.random() ã« xorshift128+ ãšããã¢ã«ãŽãªãºã ã䜿ã£ãŠããïŒChrome 49ã§å©çšå¯èœã«ãªã£ããã®ïŒãV8ã®éçºããŒã èªèº«ããxorshift128+ ã¯MWC1616ããã®å€§ããªæ¹åã ããããã§ãæå·åŠçã«å®å
šã§ã¯ãªãããšæžããŠããããMDNã® Math.random() ã®ããŒãžã«ããæå·åŠçã«å®å
šãªä¹±æ°ã¯æäŸããªããã»ãã¥ãªãã£ã«é¢ããããšã«ã¯äœ¿ããªãããšããšããæ³šèšãããããåºåãããã€ã芳枬ã§ããã°ãèšç®ã§å
éšç¶æ
ãå²ãåºããŠããŸããã ã
ã§ãããã®åºåã£ãŠå€ããèŠãããã®ãªã®ïŒ
ããããã®è匱æ§ã®äºã€ç®ã®ç©Žã§ããHFSã¯ãã°ã€ã³åŠçã®ãšãã«ã»ãã·ã§ã³ãž sid = Math.random() ãå
¥ããŠããŠãkoa-sessionã®ã¯ãããŒã¯Base64ã«ããJSONã ãããçã®å€ããã®ãŸãŸã¯ã©ã€ã¢ã³ãã«å±ããŠãããã ãããããã°ã€ã³ã®ãšã³ããã€ã³ãã¯èªèšŒãªãã§å©ãããçºèŠè
ã®è§£èª¬ã§ã¯ãããããçŽ12ååã®é£ç¶ããåºåãéããã°å
éšç¶æ
ã埩å
ã§ãããšãããŠããã
å
éšç¶æ
ãåãã£ãããšã¯ãã©ããªãã®ïŒ
Microsoftã®Z3ãšããSMTãœã«ãã«èŠ³æž¬å€ãå¶çŽãšããŠäžããŠãå
éšç¶æ
ãæ±ãããxorshift128+ ã¯éåãã«ãã©ããã®ã§ãããããç¶æ
ãå·»ãæ»ããŠããã»ã¹èµ·åæãŸã§æ»ãããã ãèµ·åæã®3ååã眲åéµã ã£ããããéµãåããã°ã管çè
ã®ã»ãã·ã§ã³ã¯ãããŒãèªåã§çœ²åããŠäœããŠããŸããHFSã«ã¯ server_code ãšããèšå®ã§ã³ãŒãã眮ããæ©èœãããããã管çè
ã«ãªããæç¹ã§ä»»æã³ãŒãå®è¡ãŸã§ç¹ãã£ãããšããã®ãçºèŠè
ã®èª¬æã ãã
ãããAIãèŠã€ããã£ãŠèãããã ãã©ãã»ããšïŒ
Horizon3.aiã®Zach HanleyãAnthropicã®Mythosã䜿ã£ãŠèŠã€ãããã®ã ããè©äŸ¡ãããŠããã®ã¯ãäºã€ã®äºå®ãã€ãªããããšããã§ããæ¬äººã¯ãMythosã¯å®å
šã§ãªãæ¬äŒŒä¹±æ°ãåç¬ã§ææããã ãã§ã¯ãªããåæã«ãå¥ã®ã³ãŒãçµè·¯ããMath.random()ã®çã®åºåãæŒããŠããããšãèŠã€ãããã®äºã€ã®äºå®ãã²ãšã€ã®é£éãšããŠèªèããããšæžããŠããããªãã詳现å
¬éã®çŽåŸãããã®è匱æ§ãçãéä¿¡ãæ€ç¥ããããšããã»ãã¥ãªãã£äŒæ¥ã®ç ç©¶è
ã®æçš¿ãå ±ããèšäºããããããã ãããã¯å ±éãšSNSæçš¿ãæ ¹æ ã§ããŒããã¡ãäžæ¬¡è³æã§ç¢ºããããã話ã§ã¯ãªããã2026幎10æ4æ¥çã®CISAã®ã«ã¿ãã°ã«ããã®CVEèªäœã¯ãŸã å
¥ã£ãŠããªãããããåºãæªçšãããŠããããšæ±ºãã€ãããããã§ãæŽæ°ã¯æ©ãã«ããããã§åãåãã®ãã¡ããã©ãããã
ãŒããèªåã§ã³ãŒããæžããšãã¯ãã©ãæ°ãã€ããã°ããã®ïŒ
çšéã§åããã®ãåºæ¬ã ãã衚瀺é ã®ã·ã£ããã«ããµã³ããªã³ã°ã®ããã«ãåœãŠãããŠãå°ããªããã®ã¯ Math.random() ã§ååãã§ãéµã»ããŒã¯ã³ã»ã»ãã·ã§ã³IDã»ãã¹ã¯ãŒãåèšå®ã®ãªã³ã¯ã¿ããã«ãåœãŠããããè² ããã®ãã®ã¯æå·çšã®ä¹±æ°ã䜿ããæœéžã®ããã«åœãŠããããšäžå
¬å¹³ã«ãªããã®ããæå·çšåŽã«å¯ããŠãããšå®å¿ã ããNode.jsãªã crypto.randomBytes() ããæå·åŠçã«åŒ·ãæ¬äŒŒä¹±æ°ããŒã¿ãçæããããšæèšãããŠããããcrypto.randomUUID() ãæå·çšã®æ¬äŒŒä¹±æ°çæåšã䜿ããšæžãããŠããããã©ãŠã¶ãªã crypto.getRandomValues() ã ãããããšä»åã®æèšãããäžã€ãä¹±æ°ã®çã®åºåãå€ã«åºããªãããšãçºèŠè
ãã眲åéµã¯ç°å¢åŽããæž¡ããŠãããšããå
¥ãæ¿ããããããã«ããŠããããšãå§ããŠãããã ã
åºå žã»ç¢ºèªããæ å ±
- Rejetto HFS Session Forgery via Predictable Signing KeyïŒVulnCheck Advisory / CVE-2026-61500ïŒ
çºè¡šæ¥: 2026-07-13 ïŒ ç¢ºèªæ¥: 2026-10-05
- ãRejetto HFS 3.0.0 through 3.2.0 derives its session-cookie signing key from the non-cryptographic Math.random() generatorããšèšèŒã圱é¿ç¯å²ã¯3.0.0ã3.2.0ã§ãåå ã¯éæå·çšã® Math.random() ãã眲åéµãå°åºããŠããããš
- æ»ææé ãšããŠãcollect a small number of login responses, reconstruct the generator's state, recover the signing key, and forge a valid administrator session cookieããšèšèŒãå¿ èŠãªèŠ³æž¬æ°ã¯ãã®è³æã§ã¯ãa small numberããšãã衚çŸã«ãšã©ãŸã
- æåæã®åœ±é¿ã¯ãfull administrative access and remote code execution via the server_code configuration featureããšèšèŒãä»»æã³ãŒãå®è¡ã¯HFSã® server_code èšå®æ©èœãçµç±ãã
- æ·±å»åºŠã¯CVSS 9.3ïŒCriticalïŒããã¯ã¿ã¯ CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:Nãåé¡ã¯CWE-338ïŒUse of Cryptographically Weak Pseudo-Random Number GeneratorïŒ
- ä¿®æ£çã¯3.2.1ãDisclosureæ¥ä»ã¯2026幎7æ13æ¥ãšèšèŒ
- çºèŠã®ã¯ã¬ãžãã㯠Zach HanleyïŒ@hacks_zach, Horizon3.aiïŒãš Claude / Anthropic Research
- ãã®è³æèªäœã«ã¯å®ç°å¢ã§ã®æªçšïŒin-the-wild exploitationïŒã®èšèŒã¯ãªãïŒ2026-10-05æç¹ã§æ¬æã確èªïŒ
- Anthropic Mythos Finds Rejetto HFS RCEïŒHorizon3.ai æè¡è©³çްïŒ
çºè¡šæ¥: 2026-09-30 ïŒ ç¢ºèªæ¥: 2026-10-05
- å ¬éæ¥ã¯2026幎9æ30æ¥ã察象ã¯Rejetto HFS 3.XïŒTypeScriptã§æžãçŽãããç³»åïŒ
- 眲åéµã¯èµ·åæã® randomId(30) ã§çæããããã®åŠçã Math.random() ãã¡ããã©3ååïŒ3 consecutive outputsïŒæ¶è²»ãããšèšèŒ
- ã»ãã·ã§ã³ã¯ãããŒã®çœ²åã¯Koaãã¬ãŒã ã¯ãŒã¯ã®keygripãè¡ããšèšèŒ
- æŒæŽ©çµè·¯ã«ã€ããŠãkoa-session cookies are base64 JSON...so the client receives the exact 52-bit double in its own Set-CookieããšèšèŒãèªèšŒåŠçã sid = Math.random() ãã»ãã·ã§ã³ã«æ ŒçŽããçã®å€ãã¯ã©ã€ã¢ã³ããžæž¡ã£ãŠãã
- å éšç¶æ ã®åŸ©å ã«ã¯èªèšŒäžèŠã®ãã°ã€ã³ãšã³ããã€ã³ããããapproximately 12 consecutive observationsããå¿ èŠãšèšèŒ
- åŸ©å ææ³ã¯Microsoftã®SMTãœã«ãZ3ã«èŠ³æž¬å€ãå¶çŽãšããŠäžããæ¹åŒããxorshift128+ invertible over GF(2), refills are 64 deterministic forward steps so state steps backwards to process startããšèšèŒããç¶æ ãããã»ã¹èµ·åæãŸã§å·»ãæ»ãã
- Mythosã®è²¢ç®ãšããŠãMythos didn't just flag the insecure PRNG in isolation â it simultaneously identified that the application leaked raw Math.random() outputs through a separate code path, recognized those two facts as a chain.ããšèšèŒ
- 圱é¿ã¯ãunauthenticated access to administrative control, and ultimately, remote code executionããšèšèŒ
- æšå¥šå¯Ÿçãšã㊠Math.random() ã crypto.randomBytes() ãªã©ã®æå·çšä¹±æ°ãžçœ®ãæããããšã眲åéµãç°å¢åŽããæž¡ãããšãéµã®ããŒããŒã·ã§ã³æ©æ§ãçšæããããšãæããŠãã
- Release 3.2.1ïŒrejetto/hfs GitHub ReleasesïŒ
çºè¡šæ¥: 2026-07-13 ïŒ ç¢ºèªæ¥: 2026-10-05
- ãªãªãŒã¹æ¥ã¯2026幎7æ13æ¥ïŒ15:31 UTCïŒ
- ãMultiple security vulnerabilities have been found in all previous versions, potentially allowing an attacker to gain administrative access to HFS.ããšèšèŒãéå»ã®å šããŒãžã§ã³ã§è€æ°ã®è匱æ§ãããã管çè ã¢ã¯ã»ã¹ãåŸãããå¯èœæ§ããããšã ãè¿°ã¹ãå ·äœçãªä»çµã¿ã¯èšèŒããŠããªã
- Zach HanleyïŒHorizon3.aiïŒããã³ Claude / Anthropic Research ãžã®ã¯ã¬ãžãããèšèŒ
- CVE-2026-61500ïŒOSV - Open Source VulnerabilitiesïŒ
çºè¡šæ¥: 2026-07-13 ïŒ ç¢ºèªæ¥: 2026-10-05
- Published ã¯2026-07-13T17:21:55ZãModified ã¯2026-10-02T03:30:27Z
- 圱é¿ããã±ãŒãžã¯ github.com/rejetto/hfsã圱é¿ããŒãžã§ã³ã¯3.0.0ã3.2.0ãä¿®æ£ããŒãžã§ã³ã¯3.2.1
- CVSS 9.3ïŒCriticalïŒãCWE-338
- Known Exploited Vulnerabilities CatalogïŒCISA å
¬åŒJSONãã£ãŒãïŒ
çºè¡šæ¥: 2026-10-04 ïŒ ç¢ºèªæ¥: 2026-10-05
- catalogVersion 㯠2026.10.04ãdateReleased 㯠2026-10-04T18:52:56.0635Zãåé²ä»¶æ°ã¯1734ä»¶ïŒ2026-10-05ã«JSONãååŸããŠç¢ºèªïŒ
- CVE-2026-61500 ã¯ãã®ã«ã¿ãã°ã«åé²ãããŠããªãïŒååŸããJSONã®å š1734ä»¶ãCVE IDã§æ€çŽ¢ããŠäžåšã確èªïŒ
- Rejetto HTTP File Server ã§ã¯ CVE-2024-23692 ã dateAdded 2024-07-09ã»CWE-1336 ã§åé²ãããknownRansomwareCampaignUse ã¯ãKnownããšèšé²ãããŠãã
- Rejetto HTTP File Server (HFS) ã§ã¯ CVE-2014-6287 ã dateAdded 2022-03-25ã»CWE-94 ã§åé²ãããknownRansomwareCampaignUse ã¯ãUnknownããšèšé²ãããŠãã
- There's Math.random(), and then there's Math.random()ïŒV8 å
¬åŒããã°ïŒ
çºè¡šæ¥: 2015-12-17 ïŒ ç¢ºèªæ¥: 2026-10-05
- V8㯠Math.random() ã« xorshift128+ ãæ¡çšããV8 4.9.41.0ïŒChrome 49ã§å©çšå¯èœïŒããæå¹ã«ãªã£ããšèšèŒããã以åã¯MWC1616ã䜿ã£ãŠãã
- ãeven though xorshift128+ is a huge improvement over MWC1616, it is still not cryptographically secureããšèšèŒãæå·çšéã«ã¯ window.crypto.getRandomValues ã䜿ãããæ¡å ããŠãã
- Math.random() - JavaScript | MDN
çºè¡šæ¥: 2026-10-05 ïŒ ç¢ºèªæ¥: 2026-10-05
- ãMath.random() does not provide cryptographically secure random numbers. Do not use them for anything related to security. Use the Web Crypto API instead, and more precisely the Crypto.getRandomValues() method.ããšããæ³šèšãèšèŒ
- Crypto | Node.js v26 Documentation
çºè¡šæ¥: 2026-10-05 ïŒ ç¢ºèªæ¥: 2026-10-05
- crypto.randomBytes(size[, callback]) ã¯ãGenerates cryptographically strong pseudorandom data.ããšèšèŒ
- crypto.randomUUID([options]) ã¯ãGenerates a random RFC 4122 version 4 UUID. The UUID is generated using a cryptographic pseudorandom number generator.ããšèšèŒ