CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-23849

Clockwatching: Weaponizing Milliseconds in File Browser Authentication

Alon Barad
Alon Barad
Software Engineer

Jan 21, 2026·6 min read·30 visits

Executive Summary (TL;DR)

File Browser versions prior to 2.55.0 failed to use constant-time comparison logic during authentication. Because verifying a password with bcrypt takes significantly longer than checking if a user exists in the database, the server responded much faster for invalid users than for valid ones. This discrepancy allows attackers to accurately map out valid accounts on the system.

A classic timing side-channel vulnerability in the popular File Browser application allows unauthenticated attackers to enumerate valid usernames by measuring the server's response time during login attempts.

The Hook: The Ticking Time Bomb

In the world of web application security, we often obsess over the data the server explicitly sends back—error messages, stack traces, or JSON payloads. But sometimes, the most damning information isn't what the server says, but how long it takes to say it.

File Browser is a sleek, Go-based file manager that people love for its speed and simplicity. It’s often used to manage sensitive documents, making it a juicy target. However, in its quest for efficiency, the authentication mechanism leaked information through a classic side-channel: time.

This vulnerability (CVE-2026-23849) is a textbook example of a timing attack. It allows an attacker to ask the server, "Does the user 'admin' exist?" and receive a silent "Yes" simply by watching a stopwatch. It’s the digital equivalent of knocking on a door: if someone walks to the peephole to check who it is, you know someone is home, even if they don't open the door. If the house is empty, the silence is immediate.

The Flaw: A Short-Circuit to Disaster

The root cause lies in a common programming optimization that turns fatal in a security context: the short-circuit logical OR operator (||). Developers are taught to optimize code by failing fast. If a condition is met that invalidates the request, why do more work?

In the vulnerable JSONAuth.Auth function, the code logic was essentially: "If the user lookup fails OR the password check fails, deny access."

Here is the logic in plain English:

  1. Check the database for the username.
  2. If the user is NOT found, stop immediately and return an error.
  3. If the user IS found, proceed to hash the provided password and compare it to the stored hash.

The fatal flaw is step 3. File Browser uses bcrypt for password hashing. Bcrypt is intentionally slow. It uses a work factor (cost) to make brute-forcing hard, typically taking 50ms to 500ms depending on the server CPU. A database lookup for a missing user, on the other hand, takes microseconds—maybe 1ms total.

This creates a massive, measurable time gap.

  • Invalid User: ~1ms response.
  • Valid User: ~50ms+ response.

To a hacker, that 50ms difference is as loud as a siren.

The Code: The Smoking Gun

Let's look at the Go code responsible for this logic. This snippet is from auth/json.go.

The Vulnerable Code

u, err := usr.Get(srv.Root, cred.Username)
// The fatal flaw:
// If err != nil (User not found), the second part is NEVER executed.
if err != nil || !users.CheckPwd(cred.Password, u.Password) {
    return nil, os.ErrPermission
}

Go's runtime executes the left side of || first. If err != nil, the statement evaluates to true, and the block executes immediately. The expensive users.CheckPwd function is skipped entirely.

The Fix (Version 2.55.0)

The patch introduces a concept known as "Constant Time Execution" (or strictly speaking, normalized execution time). The developers realized they must perform a bcrypt hash even if the user doesn't exist.

// Define a dummy hash to burn CPU cycles if the user is missing
const dummyHash = "$2a$10$O4mEMeOL/nit6zqe.WQXauLRbRlzb3IgLHsa26Pf0N/GiU9b.wK1m"
 
func (a JSONAuth) Auth(...) {
    u, err := usr.Get(srv.Root, cred.Username)
 
    // Normalize the data
    hash := dummyHash
    if err == nil {
        hash = u.Password
    }
 
    // ALWAYS perform the expensive check
    // If user is missing, we check against dummyHash.
    // If user exists, we check against real hash.
    match := users.CheckPwd(cred.Password, hash)
 
    if !match || err != nil {
        return nil, os.ErrPermission
    }
    return u, nil
}

By forcing the server to crunch numbers regardless of the username's validity, the response times flatten out. The signal is lost in the noise.

The Exploit: Weaponizing Statistics

Exploiting timing attacks over a network (like the internet) is tricky because of "jitter." Network latency varies. A 50ms spike might just be a router hiccup, not a valid user. To exploit this reliably, we use statistics.

The Attack Strategy

  1. Calibration: The attacker sends 50 requests with random, garbage usernames (e.g., user_xyz123). They measure the average response time and calculate the standard deviation.
  2. Thresholding: A threshold is set, usually Mean + (5 * Standard_Deviation). Anything above this is statistically significant.
  3. Enumeration: The attacker iterates through a wordlist (e.g., admin, root, backup).
  4. Verification: If a request exceeds the threshold, it is flagged as a valid user.

The PoC Logic

A Python script targeting this vulnerability would look something like this:

def measure_response(user):
    start = time.perf_counter()
    requests.post(target, json={"username": user, "password": "x"})
    return time.perf_counter() - start
 
# 1. Calibrate Baseline (Invalid Users)
baseline_times = [measure_response(random_str()) for _ in range(50)]
threshold = mean(baseline_times) + 0.05 # Add 50ms buffer
 
# 2. Attack
for user in wordlist:
    latency = measure_response(user)
    if latency > threshold:
        print(f"[+] VALID USER FOUND: {user} ({latency:.4f}s)")

> [!NOTE] > In a real-world scenario, smart attackers will average multiple requests for the same username to smooth out network jitter, making the detection of valid accounts nearly 100% accurate.

The Impact: Why Should You Care?

You might ask, "So what if they know my username? They still need the password."

True, but in security, knowledge is power. Username enumeration is the precursor to more aggressive attacks.

  1. Focused Brute Force: Instead of trying 1000 passwords against 1000 users (1,000,000 requests), I can find the one valid admin user and try 10,000 passwords against just them. It's quieter and more effective.
  2. Social Engineering: If I know j.smith is a user, I can target John Smith with a specific phishing email regarding his File Browser account.
  3. Default Credentials: Attackers will instantly check valid users against common passwords like password, 123456, or the username itself.

In a system like File Browser, which often sits on the perimeter allowing access to internal files, a compromised account often leads to full data exfiltration or Remote Code Execution (if the user can upload files).

The Fix: Remediation

The fix is straightforward: Update to File Browser v2.55.0.

If you cannot update immediately, you must rely on perimeter defenses:

  1. Rate Limiting: Configure your reverse proxy (Nginx, Traefik, Apache) to aggressively rate-limit the /api/login endpoint. If an attacker can only make 1 request every 5 seconds, the statistical analysis required for a timing attack becomes painfully slow.
  2. Fail2Ban: Implement IP banning for repeated failed login attempts. Since the attacker must generate failed logins to measure the time, they will trip this alarm quickly.
  3. WAF Rules: Block requests that look like automated enumeration tools (checking for User-Agent strings or rapid-fire sequencing).

Official Patches

File BrowserCommit fixing the timing leak

Fix Analysis (1)

Technical Appendix

CVSS Score
5.3/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
EPSS Probability
0.09%
Top 100% most exploited

Affected Systems

File Browser (GitHub: filebrowser/filebrowser)

Affected Versions Detail

Product
Affected Versions
Fixed Version
File Browser
File Browser
< 2.55.02.55.0
AttributeDetail
CWE IDCWE-208
Attack VectorNetwork
CVSS5.3 (Medium)
EPSS Score0.0009
ImpactInformation Disclosure (Username Enumeration)
Exploit StatusPoC Available

MITRE ATT&CK Mapping

T1078Valid Accounts
Defense Evasion
T1087Account Discovery
Discovery
CWE-208
Observable Timing Discrepancy

Observable Timing Discrepancy

Known Exploits & Detection

GitHub Security AdvisoryOriginal advisory containing the timing attack logic

Vulnerability Timeline

Vulnerability Published
2026-01-19
Patch Released (v2.55.0)
2026-01-19

References & Sources

  • [1]GHSA Advisory
  • [2]NVD Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 7 hours ago•CVE-2026-53634
4.3

CVE-2026-53634: Missing Authorization in Code16 Sharp Quick Creation Command Controller

Code16 Sharp versions from 9.0.0 up to (but not including) 9.22.3 are vulnerable to a missing authorization flaw in the Quick Creation Command feature. The ApiEntityListQuickCreationCommandController fails to validate entity-level 'create' policies before returning administrative form designs or processing database modifications. Authenticated users with restricted access can bypass policy boundaries to access creation configurations and insert records.

Alon Barad
Alon Barad
6 views•5 min read
•about 8 hours ago•CVE-2026-49471
8.3

CVE-2026-49471: Unauthenticated Remote Code Execution in Serena MCP Toolkit via DNS Rebinding and Memory Poisoning

CVE-2026-49471 is a high-severity security vulnerability in Serena, an AI-assisted coding Model Context Protocol (MCP) toolkit. In versions prior to v1.5.2, Serena's built-in web dashboard exposes an unauthenticated Flask API on a predictable port. Lacking host validation and CSRF protections, this endpoint is vulnerable to DNS Rebinding. An attacker can lure a user to a malicious webpage, bypass the Same-Origin Policy (SOP), rewrite the AI agent's persistent memory, and execute arbitrary commands on the host operating system via the autonomous agent's shell execution engine.

Alon Barad
Alon Barad
10 views•5 min read
•about 8 hours ago•GHSA-MXWC-WH95-PW4G
5.3

GHSA-MXWC-WH95-PW4G: Denial of Service via Uncontrolled Recursion in Trapster DNS Parser

The trapster honeypot package is vulnerable to a remote denial of service (DoS) vulnerability due to uncontrolled recursion during the parsing of malformed DNS compression pointers in the decode_labels function.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 9 hours ago•GHSA-Q95X-7G78-RCCV
6.3

GHSA-Q95X-7G78-RCCV: Safe Rust Memory Corruption via Use-After-Free in oneringbuf Crate

A critical Use-After-Free (UAF) memory corruption vulnerability exists in the oneringbuf Rust crate prior to version 0.8.0. The vulnerability allows safe Rust code to instantiate and clone reference wrappers that point to heap-allocated ring buffers. Dropping one wrapper prematurely reclaims the backing memory, leading to dangling pointer references and subsequent Use-After-Free or Double Free states.

Amit Schendel
Amit Schendel
7 views•7 min read
•about 22 hours ago•CVE-2026-53359
8.8

CVE-2026-53359: Use-After-Free in Linux Kernel KVM Shadow MMU (Januscape)

Januscape (CVE-2026-53359) is a critical Use-After-Free vulnerability in the x86 Shadow MMU component of the Linux Kernel's KVM subsystem. A logic error in shadow page tracking permits unauthorized page reuse without validating architectural execution roles, leading to dangling pointers in reverse mapping (rmap) tracking entries during guest memory teardown.

Amit Schendel
Amit Schendel
89 views•5 min read
•about 22 hours ago•CVE-2026-48282
10.0

CVE-2026-48282: Unauthenticated Path Traversal and Arbitrary File Write in Adobe ColdFusion Remote Development Services

CVE-2026-48282 is a critical unauthenticated path traversal and arbitrary file write vulnerability in the Remote Development Services (RDS) component of Adobe ColdFusion. The vulnerability allows a remote, unauthenticated attacker to bypass directory boundaries and write arbitrary files, including CFML-based web shells, onto the host server. This flaw is actively exploited in the wild and enables full unauthenticated remote code execution under the privileges of the ColdFusion service account.

Alon Barad
Alon Barad
43 views•6 min read