<?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://db.gcve.eu</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>Mon, 12 Oct 2026 08:44:29 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-91982</title>
      <link>https://db.gcve.eu/vuln/fkie_cve-2026-91982</link>
      <description>&lt;p&gt;Vikunja before 2.6.0 continues to expose the raw TOTP shared secret after enrollment through the GET /api/v1/user/settings/totp and /api/v1/user/settings/totp/qrcode endpoints without re-authentication. Attackers with a valid access token can read the secret, import it into their own authenticator, and generate valid codes indefinitely to defeat the second factor and enable account takeover.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Vikunja before 2.6.0 continues to expose the raw TOTP shared secret after enrollment through the GET /api/v1/user/settings/totp and /api/v1/user/settings/totp/qrcode endpoints without re-authentication. Attackers with a valid access token can read the secret, import it into their own authenticator, and generate valid codes indefinitely to defeat the second factor and enable account takeover.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/fkie_cve-2026-91982</guid>
    </item>
    <item>
      <title>GHSA-88f6-4rjv-x774 — Vikunja: TOTP secret is readable after enrollment, no step-up auth</title>
      <link>https://db.gcve.eu/vuln/ghsa-88f6-4rjv-x774</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Go: code.vikunja.io/api&lt;/p&gt;
&lt;p&gt;### Summary
Once a user has TOTP enabled, the API still hands back the raw shared secret to anyone holding that account&amp;#39;s access token. Reading it doesn&amp;#39;t ask for the password, even though disabling TOTP does. So a stolen token, an XSS, or a browser left open is enough to copy the second factor into your own authenticator and keep generating valid codes indefinitely.&lt;/p&gt;
&lt;p&gt;### Details
`GET /api/v1/user/settings/totp` returns the full TOTP object, including the secret field and the otpauth:// provisioning URL. `GET /api/v1/user/settings/totp/qrcode` renders the same secret as a QR image. Neither requires re-authentication, the access token alone is enough.&lt;/p&gt;
&lt;p&gt;This is inconsistent with the rest of the flow: `POST /api/v1/user/settings/totp/disable` calls CheckUserPassword before it will turn TOTP off. So the destructive action is gated behind the password, but reading out the secret that backs the second factor isn&amp;#39;t. There&amp;#39;s also no reason for the secret to be readable at all once enrollment is finished, the client only needs it during setup.&lt;/p&gt;
&lt;p&gt;The fix is to stop returning secret/url/the QR code once enabled is true (only expose them during the enrollment window). Requiring the password on the read, like disable already does, would also be reasonable.&lt;/p&gt;
&lt;p&gt;### PoC
The attacker needs the victim&amp;#39;s access token, from an XSS, a leaked/stolen token, or an unlocked session. TOTP must already be enabled on the account.&lt;/p&gt;
&lt;p&gt;1. With the victim&amp;#39;s bearer token, call:
```
GET /api/v1/user/settings/totp…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Go: code.vikunja.io/api&lt;/p&gt;
&lt;p&gt;### Summary
Once a user has TOTP enabled, the API still hands back the raw shared secret to anyone holding that account&amp;#39;s access token. Reading it doesn&amp;#39;t ask for the password, even though disabling TOTP does. So a stolen token, an XSS, or a browser left open is enough to copy the second factor into your own authenticator and keep generating valid codes indefinitely.&lt;/p&gt;
&lt;p&gt;### Details
`GET /api/v1/user/settings/totp` returns the full TOTP object, including the secret field and the otpauth:// provisioning URL. `GET /api/v1/user/settings/totp/qrcode` renders the same secret as a QR image. Neither requires re-authentication, the access token alone is enough.&lt;/p&gt;
&lt;p&gt;This is inconsistent with the rest of the flow: `POST /api/v1/user/settings/totp/disable` calls CheckUserPassword before it will turn TOTP off. So the destructive action is gated behind the password, but reading out the secret that backs the second factor isn&amp;#39;t. There&amp;#39;s also no reason for the secret to be readable at all once enrollment is finished, the client only needs it during setup.&lt;/p&gt;
&lt;p&gt;The fix is to stop returning secret/url/the QR code once enabled is true (only expose them during the enrollment window). Requiring the password on the read, like disable already does, would also be reasonable.&lt;/p&gt;
&lt;p&gt;### PoC
The attacker needs the victim&amp;#39;s access token, from an XSS, a leaked/stolen token, or an unlocked session. TOTP must already be enabled on the account.&lt;/p&gt;
&lt;p&gt;1. With the victim&amp;#39;s bearer token, call:
```
GET /api/v1/user/settings/totp…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-88f6-4rjv-x774</guid>
    </item>
  </channel>
</rss>
