Feb 13, 2026·6 min read·50 visits
A critical flaw in Known < 1.6.3 allows anyone to reset an admin password by simply inspecting the HTML source code. The application leaks the database-stored reset token into a hidden input field when visited with a target's email address.
CVE-2026-26273 is a catastrophic logic flaw in the 'Known' social publishing platform that turns the password reset mechanism into an open buffet for attackers. By simply knowing a victim's email address, an unauthenticated attacker can trigger a password reset and then retrieve the secret recovery token directly from the application's HTML source code. This bypasses the email delivery requirement entirely, allowing for instant, silent, and full account takeover (ATO). Rated as Critical (CVSS 9.8), this vulnerability highlights the dangers of implicit trust in client-side requests and 'convenience' features that leak state.
In the world of web application security, there is a fine line between 'User Experience' and 'Catastrophic Failure'. The developers of Known, a Fediverse-ready social publishing platform, decided to cross that line, sprint a mile past it, and set up camp in the land of insecure direct object references. The vulnerability, designated CVE-2026-26273, is a textbook example of what happens when code tries to be too helpful.
Usually, the password reset dance is boring but secure: you ask for a link, the server generates a token, emails it to you, and waits. The server trusts the email provider to deliver the secret key to the right person. Known, however, decided to shortcut this process. Instead of treating the reset token as a holy artifact that should only exist in the database and the user's email inbox, the application decided to pre-populate it in the HTML for anyone who asked nicely.
Imagine you lose your house keys. You call a locksmith. A secure locksmith asks for ID. The locksmith in this scenario—Known—just asks, 'Hey, are you the guy who lives at 123 Fake Street?' If you say yes, he hands you a copy of the key he keeps under the mat. This isn't complex memory corruption; it's a fundamental logic failure that results in a trivial, unauthenticated Account Takeover (ATO) of any user on the platform.
The root cause resides in Idno/Pages/Account/Password/Reset.php, specifically within the getContent() method. This function handles the HTTP GET request when a user navigates to the password reset page. In a sane implementation, this page should either ask for the token (if clicked from an email) or tell the user to check their inbox. It should never know what the token is unless the user provides it.
However, the code logic took a fatal detour. When a request arrived with an email parameter (e.g., ?email=victim@target.com), the application instantiated the user object associated with that email. So far, standard procedure. But then, it did the unthinkable: it queried the database for the user's current active password recovery code.
It didn't stop there. Having fetched this secret, the application passed it directly into the template engine. The intention was likely to 'help' legitimate users who might have clicked a malformed link or to pre-fill state for the form submission. The result, however, was that the secret token was rendered into the HTML source code of the page, sitting quietly in a hidden input field, waiting to be scraped.
Let's look at the PHP code responsible for this disaster. This is a reconstruction of the vulnerable logic in getContent() prior to version 1.6.3:
// VULNERABLE CODE (Simplified)
$email = $this->getInput('email');
if ($user = \Idno\Entities\User::getByEmail($email)) {
// FATAL ERROR: Fetching the secret directly from the DB
$code = $user->getPasswordRecoveryCode();
// Passing the secret to the template
$t = \Idno\Core\site()->template();
$t->__(['code' => $code])->draw('account/password/reset');
}And inside the template, the betrayal is complete:
<!-- rendered HTML output -->
<form action="/account/password/reset" method="post">
<input type="hidden" name="code" value="[SECRET_TOKEN_HERE]">
<input type="password" name="password" placeholder="New Password">
...
</form>The fix, applied in commit 8439a0747471559fb1ea9f074b929d390f27e66a, introduces basic sanity checks. It forces the user to provide the code via the URL first, and then uses hash_equals (a constant-time string comparison function) to validate it against the database. If they don't match, or if the code wasn't provided, the form is never rendered with the token.
// PATCHED CODE
$code = $this->getInput('code');
if (!empty($code) && hash_equals($code, $user->getPasswordRecoveryCode())) {
// Only render if the user ALREADY knows the code
$t->__(['code' => $code])->draw('account/password/reset');
}Exploiting this is trivially easy. It requires no special tooling—just a web browser and the 'View Source' button. Here is the kill chain for taking over the administrator account.
Step 1: The Trigger First, we need the server to generate a token. We send a standard POST request to the 'Forgot Password' endpoint. The server dutifully generates a random token, saves it to the database, and emails it to the victim. We don't have access to the victim's email, but thanks to this bug, we don't need it.
Step 2: The Retrieval
We navigate to the reset page, appending the victim's email address to the URL: https://target-site.com/account/password/reset/?email=admin@target-site.com. The application sees the email, looks up the admin user, grabs the token we just triggered in Step 1, and serves us the page.
Step 3: The Extraction
We right-click and select Inspect Element (or View Source). We search for name="code". There it is:
<input type="hidden" name="code" value="29d390f27e66a...">.
Step 4: The Takeover We don't even need to craft a custom POST request. We just type a new password into the form presented on the screen and hit 'Save'. Because the form was pre-filled with the valid token by the server itself, the password change is accepted. We now own the admin account.
This is a CVSS 9.8 for a reason. In a social publishing platform, an Account Takeover is not just about reading DMs. It is about reputation destruction and potential supply chain attacks.
If an attacker compromises an administrator account on a Known instance, they can:
This is a 'Game Over' vulnerability. There is no mitigation other than patching. If your instance is exposed to the internet and running < 1.6.3, it is likely already compromised.
CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
Known idno | < 1.6.3 | 1.6.3 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-200 (Info Exposure) |
| CVSS v3.0 | 9.8 (Critical) |
| Attack Vector | Network (Web) |
| Privileges | None |
| Impact | Full Account Takeover |
| Patch Commit | 8439a0747471559fb1ea9f074b929d390f27e66a |
The product exposes sensitive information to an unauthorized actor.
A stored Cross-Site Scripting (XSS) vulnerability was identified in Indico, an open-source event management system developed at CERN, prior to version 3.3.13. The vulnerability stems from weak URL validation in custom link fields and lack of HTML sanitization during Marshmallow serialization of event notes. This allows authenticated attackers with event modification privileges to inject malicious payloads that execute in the browser of users viewing the event pages or collaborating on notes.
A technical analysis of CVE-2026-107397, a stored Cross-Site Scripting (XSS) vulnerability in Indico's collaborative notes editor and custom link generation fields. Prior to version 3.3.13, Marshmallow serialization schemas omitted HTML sanitization during conflict resolution, and form validators failed to enforce strict URI schemes, enabling authenticated low-privilege attackers to execute arbitrary JavaScript.
An authorization bypass vulnerability exists in the legacy session export API of Indico, an open-source event management system developed at CERN. Due to a missing object-level access check, authenticated users can bypass configuration-level restrictions to extract private session metadata (including session titles, descriptions, and list of conveners) from events that they are otherwise authorized to view.
An incomplete Server-Side Request Forgery (SSRF) validation check in Indico prior to version 3.3.13 allows authenticated event organizers to bypass outbound network restrictions. By utilizing backslash characters within crafted URLs, attackers can exploit a parser differential between the application's validator and the downstream HTTP client library to access internal network resources.
CVE-2026-107717 represents a critical prompt boundary bypass and chat role injection vulnerability in the Banks Python package (versions prior to 2.5.0). The library parses generated template outputs line-by-line, attempting to validate each segment as a JSON-serialized ChatMessage object without validating the source boundaries of the text. If an application integrates user input directly into a prompt template, a remote, unauthenticated attacker can supply multi-line inputs with structured JSON payloads. This input is then parsed as high-privilege system instructions or tool execution responses, completely hijacking downstream Large Language Model behavior.
Improper pathname limitation and link resolution (CWE-22 and CWE-59) in the banks library prior to version 2.5.1 allow local attackers to read or write arbitrary files via crafted symbolic links in the prompt directory registry.