
Gitea Actions artifact v4 DoS के लिए Proof-of-concept और lab: parseProtobufBody में unbounded io.ReadAll एक job token को oversized CreateArtifact bodies POST करने देता है।
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-artifact-v4-readall
Gitea 1.27.3 - Gitea
job_summary.go पहले से ही MaxJobSummarySize (1 MiB) पर io.LimitReader के साथ सीमित है। artifact v4 में parseProtobufBody बिना किसी सीमा के io.ReadAll(ctx.Req.Body) करता है। CreateArtifact, Finalize, List, Get, Delete सभी इसी से गुज़रते हैं। एक रैंडम यूज़र PAT पर्याप्त नहीं है। आपको एक चल रहा Actions job token चाहिए। Fork-PR jobs अभी भी 1.27.3 पर NeedApproval करते हैं।
Job-summary ने LimitReader सीख लिया। Artifact v4 ने इसे कॉपी नहीं किया। एक लाइव job 12 MiB का CreateArtifact POST कर सकता है और Gitea पूरा बफ़र कर लेता है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-400 |
| CVSS | Medium: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H |
| Product | Gitea |
| Affected | v1.27.3 (146cc3e) तक, Actions सक्षम होने पर |
| Auth | चल रहा Actions job token |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
एक चल रहे Actions job से (उनका अपना repo, या एक fork-PR जो पहले ही NeedApproval पास कर चुका है), मनमाने आकार का v4 CreateArtifact body POST करें और Gitea को इसे पूरी तरह बफ़र करने के लिए मजबूर करें। उसी instance पर job-summary पहले से ही 1 MiB से अधिक कुछ भी अस्वीकार करता है।
यह Gitea प्रक्रिया पर memory pressure है। Lab ने अनुपस्थित सीमा साबित की (12 MiB -> 200)। इसने प्रक्रिया को नहीं मारा। यह RCE नहीं है। यह unauthenticated नहीं है। एक चुराया गया user PAT बिना लाइव job के इस पथ तक नहीं पहुँचता।
GHSA लहर के बाद बचा हुआ map में Actions body handling शामिल था। Fork-PR jobs अभी भी 1.27.3 पर NeedApproval करते हैं, इसलिए यह unauth fork-PR skip नहीं है। मैंने देखा कि Actions API request bodies को कैसे पढ़ता है। Job-summary में एक संख्या है। Artifact v4 में नहीं है।
मैंने gitea/act_runner:0.2.13 खड़ा किया, एक hold workflow seed किया ताकि एक job token मौजूद हो, और 12 MiB का CreateArtifact POST किया। HTTP 200 ok साथ में signedUploadUrl। फिर 8 MiB job-summary: 400 invalid summary। GET /api/v1/version अभी भी 200। Gitea चालू रहा। Lab mem_limit 1g है। Body 12 MiB पर सीमित ताकि host प्रयोग न हो। केवल host executor। कोई docker.sock नहीं।
पहले से दर्ज गलत मोड़: job token के बिना CreateArtifact (401 बग नहीं है); process kill / OOM (SUCCESS 12 MiB -> 200 है जबकि 8 MiB summary -> 400); signedUploadUrl को RCE मानना; fork-PR unauth; एक reverse shell। नाटक।
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:18135। In-compose ROOT_URL http://gitea:3000/ है ताकि runner register कर सके।
v4-create status=200 sent=12582912
v4-unbounded-readall=1
job-summary status=400 sent=8388608 invalid summary cap=MaxJobSummarySize=1048576
gitea-still-up status=200
SUCCESS GITEA-ARTIFACT-V4-READALL
parseProtobufBody को proto-आकार की सीमा पर io.LimitReader में लपेटें, MaxJobSummarySize के समान पैटर्न। 12 MiB CreateArtifact को उसी श्रेणी के तरीके से विफल होना चाहिए जैसे 8 MiB job-summary पहले से होता है।
GNU Affero GPL v3.0। देखें LICENSE। केवल loopback lab। कोई वारंटी नहीं।