
# सुरक्षा-अनुसंधान प्रयोगशाला: CVE-2025-61584 (GHSA-9g7x-737f-5xpc) का पुनरुत्पादन — pull_request_target वर्कफ़्लो (.github/workflows/pr.yml) में github.head_ref के माध्यम से कमांड इंजेक्शन
स्वचालित शोध कलाकृति — मूल अपस्ट्रीम प्रोजेक्ट नहीं।
यह रिपॉजिटरी एक स्वचालित हार्नेस द्वारा निर्मित एक डिस्पोजेबल लैब है, जो Université Laval में मास्टर की थीसिस के लिए प्रकाशित GitHub Actions वर्कफ़्लो कमजोरियों को पुन: प्रस्तुत करने हेतु बनाई गई है। यह
serverless-dns/serverless-dnsका एक शब्दशः स्नैपशॉट है, जो कमिटb0b1a1538aeb1991b5bc13dfe4e18e686913b12e(2025-04-26) पर आधारित है, और उस प्रोजेक्ट के अपने लाइसेंस के तहत पुनर्वितरित किया गया है, जिसकी फ़ाइल इस स्नैपशॉट में अपरिवर्तित शामिल है।अपस्ट्रीम प्रोजेक्ट शामिल नहीं है, उसे कभी लक्षित नहीं किया जाता, और यहाँ अध्ययन की गई कमजोरी पहले से ही सार्वजनिक है। इस रिपॉजिटरी में हर सीक्रेट और वेरिएबल एक यादृच्छिक रूप से उत्पन्न डमी मान है — कोई वास्तविक क्रेडेंशियल मौजूद नहीं है। एक्शन संदर्भ और रनर इमेज उसी पर पिन किए गए हैं जो 2025-04-26 को उन्होंने हल किया था; स्नैपशॉट में किए गए हर बदलाव के लिए हार्नेस आउटपुट में
pinning.mdदेखें।प्रश्न या आपत्तियाँ: [email protected]
serverless-dns एक Pi-Hole जैसा सामग्री-अवरोधक, सर्वरलेस, स्टब DNS-over-HTTPS (DoH) और DNS-over-TLS (DoT) रिज़ॉल्वर है। यह Cloudflare Workers, , , और पर आउट-ऑफ-द-बॉक्स चलता है। इन सभी सेवाओं के मुफ़्त टियर प्रति माह 10 से 20 डिवाइसों के DNS ट्रैफ़िक को कवर करने के लिए पर्याप्त होने चाहिए।
RethinkDNS इन एंडपॉइंट्स पर प्रोडक्शन में serverless-dns चलाता है:
| क्लाउड प्लेटफ़ॉर्म | सर्वर स्थान | प्रोटोकॉल | डोमेन | उपयोग |
|---|---|---|---|---|
| ⛅ Cloudflare Workers | 280+ (पिंग) | DoH | sky.rethinkdns.com | कॉन्फ़िगर करें |
| 🦕 Deno Deploy | 30+ (पिंग) | DoH | निजी बीटा | |
| ⏱️ Fastly Compute@Edge | 80+ (पिंग) | DoH | निजी बीटा | |
| 🪂 Fly.io | 30+ (पिंग) | DoH और DoT | max.rethinkdns.com | कॉन्फ़िगर करें |
सर्वर-साइड प्रोसेसिंग में 0 मिलीसेकंड (ms) से 2ms (माध्यिका) लगता है, और एंड-टू-एंड विलंबता (क्षेत्रों और नेटवर्कों के अनुसार भिन्न) 10ms से 30ms (माध्यिका) के बीच है।
Fly.io पर Rethink DNS रिज़ॉल्वर FOSS United द्वारा प्रायोजित है।
Cloudflare Workers serverless-dns सेटअप करने के लिए सबसे आसान प्लेटफ़ॉर्म है:
चरण-दर-चरण निर्देशों के लिए, देखें:
| प्लेटफ़ॉर्म | कठिनाई | रनटाइम | दस्तावेज़ |
|---|---|---|---|
| ⛅ Cloudflare | आसान | v8 Isolates | Cloudflare Workers पर होस्टिंग |
| 🦕 Deno.com | मध्यम | Deno Isolates | Deno.com पर होस्टिंग |
| ⏱️ Fastly Compute@Edge | आसान | Fastly JS | Fastly Compute@Edge पर होस्टिंग |
| 🪂 Fly.io | कठिन | Node MicroVM | Fly.io पर होस्टिंग |
ब्लॉकलिस्ट सेटअप करने के लिए, अपने ब्राउज़र से https://<my-domain>.tld/configure पर जाएँ (यह RethinkDNS' configure पेज के समान कुछ लोड करना चाहिए)।
सहायता या सहायता के लिए, बेझिझक एक मुद्दा खोलें या एक पैच सबमिट करें।
कोड:
# navigate to work dir
cd /my/work/dir
# clone this repository
git clone https://github.com/serverless-dns/serverless-dns.git
# navigate to serverless-dns
cd ./serverless-dns
Node:
# install node v22+ via nvm, if required
# https://github.com/nvm-sh/nvm#installing-and-updating
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
nvm install --lts
# download dependencies
npm i
# (optional) update dependencies
npm update
# run serverless-dns on node
./run n
# run a clinicjs.org profiler
./run n [cpu|fn|mem]
Deno:
# install deno.land v2+
# https://github.com/denoland/deno/#install
curl -fsSL https://deno.land/install.sh | sh
# run serverless-dns on deno
./run d
Fastly:
# install node v22+ via nvm, if required
# install the Fastly CLI
# https://developer.fastly.com/learning/tools/cli
# run serverless-dns on Fastly Compute@Edge
./run f
Wrangler:
# install Cloudflare Workers (cli) aka Wrangler
# https://developers.cloudflare.com/workers/cli-wrangler/install-update
npm i wrangler --save-dev
# run serverless-dns on Cloudflare Workers (cli)
# Make sure to setup Wrangler first:
# https://developers.cloudflare.com/workers/cli-wrangler/authentication
./run w
# profile wrangler with Chrome DevTools
# blog.cloudflare.com/profiling-your-workers-with-wrangler
इस रिपॉजिटरी पर कमिट Google JavaScript शैली गाइड को लागू करते हैं (ref: .eslintrc.cjs)।
एक git pre-commit हुक जो .js फ़ाइलों पर लिंटर (eslint) और फ़ॉर्मेटर (prettier) चलाता है। इस हुक को बायपास करने के लिए git commit --no-verify का उपयोग करें।
पुल रिक्वेस्ट की भी कोड शैली उल्लंघनों के लिए जाँच की जाती है और जहाँ संभव हो स्वचालित रूप से ठीक की जाती है।
यदि आपको डिफ़ॉल्ट ट्वीक करने की आवश्यकता हो तो env.js कॉन्फ़िगर करें।
Cloudflare Workers के लिए, इसके बजाय wrangler.toml में एनवी वेरिएबल्स सेटअप करें।
Fastly Compute@Edge के लिए, इसके बजाय fastly.toml में एनवी वेरिएबल्स सेटअप करें।
serverless-dns DoH और DoT दोनों के लिए अल्फा-न्यूमेरिक बियरर टोकन के साथ प्रमाणीकरण का समर्थन करता है। एक टोकन के लिए, msg-key (गुप्त), hex(hmac-sha256(msg-key|domain.tld), msg) के आउटपुट को csv प्रारूप में ACCESS_KEYS एनवी वेरिएबल में जोड़ें। ध्यान दें: msg वर्तमान में sdns-public-auth-info पर स्थिर है।
msg-key को ब्लॉकस्टैम्प के अंत में रखें, इस प्रकार:
1:1:4AIggAABEGAgAA:<msg-key> (यहाँ, 1 संस्करण है, 1:4AIggAABEGAgAA
ब्लॉकस्टैम्प है, <msg-key> प्रमाणीकरण गुप्त है, और : विभाजक है)।msg-key को ब्लॉकस्टैम्प वाले SNI (डोमेन-नाम) के अंत में रखें:
1-4abcbaaaaeigaiaa-<msg-key> (यहाँ 1 संस्करण है, 4abcbaaaaeigaiaa
ब्लॉकस्टैम्प है, <msg-key> प्रमाणीकरण गुप्त है, और - विभाजक है)।यदि DoT के साथ भी प्रमाणीकरण का उपयोग करने का इरादा है, तो msg-key को छोटा (8 से 24 वर्ण) रखें, क्योंकि सबडोमेन कुल मिलाकर केवल 63 वर्ण लंबे हो सकते हैं।
आप अपने फ़ोर्क के लिए एक्सेस कुंजियाँ max.rethinkdns.com से इस प्रकार उत्पन्न कर सकते हैं:
msgkey="ShortAlphanumericSecret"
domain="my-serverless-dns-domain.tld"
curl 'https://max.rethinkdns.com/genaccesskey?key='"$msgkey"'&dom='"$domain"
# output
# {"accesskey":["my-serverless-dns-domain.tld|deadbeefd3adb33fa2bb33fd3eadf084beef3b152beefdead49bbb2b33fdead83d3adbeefdeadb33f"],"context":"sdns-public-auth-info"}
serverless-dns को Cloudflare Logpush के माध्यम से लॉग अपलोड करने के लिए सेटअप किया जा सकता है।
CF_ACCOUNT_ID=<hex-cloudflare-account-id>
CF_API_KEY=<api-key-with-logs-edit-permission-at-account-level>
R2_BUCKET=<r2-bucket-name>
R2_ACCESS_KEY=<r2-access-key-for-the-bucket>
R2_SECRET_KEY=<r2-secret-key-with-read-write-permissions>
# optional, setup a filter such that only logs form this worker ends up being pushed; but if you
# do not need a filter on Worker name (script-name), edit the "filter" field below accordingly.
SCRIPT_NAME=<name-of-the-worker-as-in-wrangler-toml>
# for more options, ref: developers.cloudflare.com/logs/get-started/api-configuration
# Logpush API with cURL: developers.cloudflare.com/logs/tutorials/examples/example-logpush-curl
# Available Logpull fields: developers.cloudflare.com/logs/reference/log-fields/account/workers_trace_events
curl -s -X POST "https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/logpush/jobs" \
-H "Authorization: Bearer ${CF_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
"name": "dns-logpush",
"logpull_options": "fields=EventTimestampMs,Outcome,Logs,ScriptName×tamps=rfc3339",
"destination_conf": "r2://'"$R2_BUCKET"'/{DATE}?access-key-id='"${R2_ACCESS_KEY}"'&secret-access-key='"${R2_SECRET_KEY}"'&account-id='"{$CF_ACCOUNT_ID}"',
"dataset": "workers_trace_events",
"filter": "{\"where\":{\"and\":[{\"key\":\"ScriptName\",\"operator\":\"contains\",\"value\":\"'"${SCRIPT_NAME}"'\"},{\"key\":\"Outcome\",\"operator\":\"eq\",\"value\":\"ok\"}]}}",
"enabled": true,
"frequency": "low"
}'
wrangler.toml गुण logpush = true सेट करें, जो Logpush को सक्षम करता है।LOG_LEVEL = "logpush", जो लॉग-स्तर को बढ़ाता है ताकि केवल अनुरोध और त्रुटि लॉग उत्सर्जित हों।LOGPUSH_SRC = "csv,of,subdomains" सेट करें, जो log-pusher.js को अनुरोध लॉग केवल तभी उत्सर्जित करने के लिए बनाता है जब Workers hostname में सबडोमेन में से एक हो।R2 पर प्रकाशित लॉग को या तो R2 Workers, R2 API, या Logpush API का उपयोग करके पुनर्प्राप्त किया जा सकता है।
Workers Analytics, यदि सक्षम है, तो एक लॉग-कुंजी, lid के विरुद्ध धकेला जाता है, जो यदि अनिर्दिष्ट है तो सर्वरलेस डिप्लॉयमेंट के होस्टनाम पर सेट होता है जिसमें अवधियाँ, ., अंडरस्कोर, _ से बदल दी जाती हैं। API के माध्यम से Analytics क्वेरी करते समय प्रमाणीकरण सेटअप होना चाहिए जो एक json लौटाता है; उदा: https://max.rethinkdns.com/1:<optional-stamp>:<msg-key>/analytics?t=<time-interval-in-mins>&f=<field-name>। संभावित fields हैं ip (क्लाइंट ip), qname (dns क्वेरी नाम), region (रिज़ॉल्वर क्षेत्र), qtype (dns क्वेरी प्रकार), dom (शीर्ष-स्तरीय डोमेन), ansip (dns उत्तर ips), और cc (ans ip देश कोड)।
लॉग कैप्चर और एनालिटिक्स अभी तक Fly और Deno Deploy के लिए लागू नहीं किया गया है।
Deno Deploy (क्लाउड) और Deno (रनटाइम) समान API सतह को उजागर नहीं करते हैं (उदाहरण के लिए, Deno Deploy केवल HTTP/S सर्वर-लिसनर का समर्थन करता है; जबकि, Deno सादे HTTP और HTTP/S के अतिरिक्त कच्चे TCP/UDP/TLS का समर्थन करता है)।
Node को छोड़कर, serverless-dns एनवी वेरिएबल्स, CF_DNS_RESOLVER_URL / CF_DNS_RESOLVER_URL_2 द्वारा परिभाषित DoH अपस्ट्रीम का उपयोग करता है।
Node पर, डिफ़ॉल्ट DNS अपस्ट्रीम 1.1.1.2 (ref) या Fly.io पर चलने पर fdaa::3 पर पुनरावर्ती DNS रिज़ॉल्वर है।
Node और Deno के लिए एंट्रीपॉइंट क्रमशः src/server-node.js, src/server-deno.ts हैं,
और दोनों TCP-over-TLS, HTTP/S कनेक्शन सुनते हैं; जबकि, Cloudflare Workers के लिए एंट्रीपॉइंट, जो केवल HTTP (cli) या
HTTP/S (prod) पर सुनता है, src/server-workers.js है; और Fastly के लिए यह src/server-fastly.js है।
Node पर स्थानीय (गैर-prod) सेटअप, key (निजी) और cert (सार्वजनिक श्रृंखला) फ़ाइलें, डिफ़ॉल्ट रूप से, एनवी वेरिएबल्स, TLS_KEY_PATH और TLS_CRT_PATH में परिभाषित पथों से पढ़ी जाती हैं।
जबकि Node पर prod सेटअप के लिए (Fly.io पर), या तो TLS_OFFLOAD को true पर सेट किया जाना चाहिए या key और cert अवश्य एनवी वेरिएबल TLS_CERTKEY (ref) में base64 एन्कोडेड होने चाहिए, इस प्रकार:
# EITHER: offload tls to fly.io and set tls_offload to true
TLS_OFFLOAD="true"
# OR: base64 representation of both key (private) and cert (public chain)
TLS_CERTKEY="KEY=b64_key_content\nCRT=b64_cert_content"
Deno के लिए, key और cert फ़ाइलें एनवी वेरिएबल्स, TLS_KEY_PATH और TLS_CRT_PATH (ref) में परिभाषित पथों से पढ़ी जाती हैं।
प्रक्रिया ब्रिंगअप इनमें से प्रत्येक रनटाइम के लिए अलग है: Node के लिए, src/core/node/config.js ब्रिंगअप को नियंत्रित करता है;
जबकि Deno के लिए, यह src/core/deno/config.ts है, और Workers के लिए यह src/core/workers/config.js है।
src/system.js pub-sub विभिन्न मॉड्यूलों के बीच ब्रिंगअप चरण का समन्वय करता है।
Node और Deno पर, इन-प्रोसेस DNS कैशिंग @serverless-dns/lfu-cache द्वारा समर्थित है; Cloudflare Workers Cache Web API और
इन-प्रोसेस lfu कैश दोनों द्वारा समर्थित है। तीनों प्लेटफ़ॉर्मों पर कैशिंग को पूरी तरह से अक्षम करने के लिए, एनवी वेरिएबल, PROFILE_DNS_RESOLVES=true सेट करें।
Cloudflare Workers, और Deno Deploy क्षणिक हैं, जैसे कि, क्लाइंट अनुरोधों को सेवा देने वाली "प्रक्रिया" लंबे समय तक जीवित नहीं रहती, और वास्तव में, लगातार दो अनुरोधों को दो अलग-अलग isolates ("प्रक्रियाओं") द्वारा सेवा दी जा सकती है। Fastly Compute@Edge भी क्षणिक है लेकिन isolates का उपयोग नहीं करता, इसके बजाय Fastly प्रत्येक अनुरोध के लिए एक wasmtime सैंडबॉक्स बनाता और नष्ट करता है। Fly.io पर रिज़ॉल्वर, जो Node चलाता है, स्थायी VMs द्वारा समर्थित है और इसलिए अधिक लंबे समय तक जीवित रहता है, पारंपरिक "सर्वरफुल" वातावरणों की तरह।
Deno Deploy के लिए, कोड-बेस को deno bundle के साथ एक एकल जावास्क्रिप्ट फ़ाइल में बंडल किया जाता है और फिर Deno.com को सौंप दिया जाता है।
Cloudflare Workers बिल्ड-टाइम और रनटाइम कॉन्फ़िगरेशन wrangler.toml में परिभाषित हैं।
Webpack5 फ़ाइलों को बंडल करता है एक ESM मॉड्यूल में जिसे फिर Wrangler द्वारा Cloudflare पर अपलोड किया जाता है।
Fastly Compute@Edge बिल्ड-टाइम और रनटाइम कॉन्फ़िगरेशन fastly.toml में परिभाषित हैं।
Webpack5 फ़ाइलों को बंडल करता है एक ESM मॉड्यूल में जिसे फिर npx js-compute-runtime द्वारा WASM में संकलित किया जाता है
और बाद में Fastly CLI के साथ Fastly Compute@Edge पर पैकेज और प्रकाशित किया जाता है।
Fly.io के लिए, जो Node चलाता है, रनटाइम निर्देश fly.toml में परिभाषित हैं (जो dev और live डिप्लॉयमेंट-प्रकारों द्वारा उपयोग किया जाता है),
जबकि डिप्लॉय निर्देश node.Dockerfile में हैं। flyctl तदनुसार
Fly.io के इंफ्रास्ट्रक्चर पर serverless-dns सेटअप करता है।
# build and deploy for cloudflare workers.dev
npm run build
# usually, env-name is prod
npx wrangler publish [-e <env-name>]
# bundle, build, and deploy for fastly compute@edge
# developer.fastly.com/reference/cli/compute/publish
fastly compute publish
# build and deploy to fly.io
npm run build:fly
flyctl deploy --dockerfile node.Dockerfile --config <fly.toml> [-a <app-name>] [--image-label <some-uniq-label>]
Fly.io को TLS समाप्ति ऑफलोड करने वाले डिप्लॉय के लिए (B1 डिप्लॉयमेंट-प्रकार), रनटाइम निर्देश इसके बजाय
fly.tls.toml में परिभाषित हैं, जो पोर्ट 443 पर HTTP2 Cleartext और HTTP/1.1, और पोर्ट 853 पर TCP पर DNS सेटअप करता है।
Ref: github/workflows।
190+ ब्लॉकलिस्ट एक Succinct Radix Trie (Steve Hanov के impl पर आधारित) में संपीड़ित हैं, जिसमें "succintness" की कीमत पर स्ट्रिंग खोज (lookup) को तेज करने के लिए संशोधन किए गए हैं। ब्लॉकलिस्ट unix टाइमस्टैम्प के साथ संस्करणित हैं (src/basicconfig.json में परिभाषित जो pre.sh द्वारा डाउनलोड किया जाता है), जो सप्ताह में एक बार उत्पन्न होता है, लेकिन हम उन्हें दैनिक / प्रति घंटा उत्पन्न करना चाहेंगे,
यदि संभव हो तो देखें), और Cloudflare R2 पर होस्ट किया जाता है (एनवी वेरिएबल: CF_BLOCKLIST_URL)।
serverless-dns 3 ब्लॉकलिस्ट फ़ाइलें डाउनलोड करता है
जो रनटाइम ब्रिंगअप के दौरान radix-trie सेटअप करने के लिए आवश्यक हैं या, DNS अनुरोध की सेवा करते समय, उन्हें आलसी डाउनलोड करता है।
serverless-dns लगभग 190+ ब्लॉकलिस्ट से लगभग ~13M प्रविष्टियाँ (जनवरी 2023 तक) संकलित करता है। ये serverless-dns/blocklists रिपॉजिटरी में परिभाषित हैं।