VYPR
Moderate severityNVD Advisory· Published Jun 29, 2022· Updated Apr 22, 2025

Denial of Service (DoS) vulnerability in RSSHub

CVE-2022-31110

Description

RSSHub prior to commit 5c4177441417 is vulnerable to a ReDoS attack via specially crafted filter/filterout query parameters, causing high CPU usage and denial of service.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

RSSHub prior to commit 5c4177441417 is vulnerable to a ReDoS attack via specially crafted filter/filterout query parameters, causing high CPU usage and denial of service.

Vulnerability

Overview

RSSHub, an open-source RSS feed generator, is susceptible to a Regular Expression Denial of Service (ReDoS) vulnerability. In versions before commit 5c4177441417, the filter, filterout, and related query parameters (filter_title, filter_description, filter_author, etc.) accept user-supplied regular expressions without validation or sanitization. These expressions are passed directly to JavaScript's String.match() method, allowing an attacker to submit a specially crafted regex that triggers catastrophic backtracking and consumes excessive CPU resources [1][2].

Exploitation

An attacker can exploit this vulnerability by sending an HTTP request to any RSSHub route that includes a malicious regex in the filter or filterout parameter. The reference provides a proof-of-concept using the regex /([^<>'"]+)*"</ (URL-encoded as %28%5B%5E%3C%3E%27%22%5D%2B%29%2A%22%3C) against any route (e.g., /test/complicated) [1]. No authentication is required, and the request can be made from the network without special privileges. Once processed, the affected RSSHub instance becomes unresponsive to any subsequent requests, and its CPU usage remains at 100% for hours [1].

Impact

Successful exploitation results in a denial of service (DoS) condition, rendering the RSSHub instance and its hosted services unavailable. The vulnerability can affect any deployment method except those running on serverless platforms like Vercel or GAE, which have inherent timeouts that may limit the attack's effectiveness [1]. The CVSS score has not been fully assigned by NVD, but the impact is localized to the availability of the service, with no direct confidentiality or integrity compromise [2].

Mitigation

The vulnerability has been fixed in commit 5c4177441417, which was merged into the main branch [2]. All users are strongly advised to upgrade RSSHub to the latest version. The fix likely introduces validation or limits on regular expression inputs to prevent catastrophic backtracking. No workarounds are available, as the vulnerable parameters are integral to RSSHub's filtering feature [1][2].

AI Insight generated on May 21, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
rsshubnpm
<= 1.0.0

Affected products

2

Patches

2
5c4177441417

fix: use re2, thank @Rongronggg9

https://github.com/diygod/rsshubDIYgodJun 21, 2022via ghsa
3 files changed · +305 18
  • lib/middleware/parameter.js+3 2 modified
    @@ -3,6 +3,7 @@ const cheerio = require('cheerio');
     const { simplecc } = require('simplecc-wasm');
     const got = require('@/utils/got');
     const config = require('@/config').value;
    +const RE2 = require('re2');
     
     let mercury_parser;
     
    @@ -152,9 +153,9 @@ module.exports = async (ctx, next) => {
                 const makeRegex = (string) => {
                     // default: case_senstivie = true
                     if (ctx.query.filter_case_sensitive === 'false') {
    -                    return new RegExp(string, 'i');
    +                    return new RE2(string, 'i');
                     } else {
    -                    return new RegExp(string);
    +                    return new RE2(string);
                     }
                 };
     
    
  • package.json+1 0 modified
    @@ -123,6 +123,7 @@
         "puppeteer-extra-plugin-stealth": "2.10.0",
         "query-string": "7.1.1",
         "rand-user-agent": "1.0.68",
    +    "re2": "1.17.7",
         "require-all": "3.0.0",
         "rss-parser": "3.12.0",
         "showdown": "2.1.0",
    
  • yarn.lock+301 16 modified
    @@ -989,6 +989,11 @@
         minimatch "^3.1.2"
         strip-json-comments "^3.1.1"
     
    +"@gar/promisify@^1.1.3":
    +  version "1.1.3"
    +  resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
    +  integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
    +
     "@hapi/address@2.x.x":
       version "2.1.4"
       resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
    @@ -1415,6 +1420,22 @@
       resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
       integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
     
    +"@npmcli/fs@^2.1.0":
    +  version "2.1.0"
    +  resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.0.tgz#f2a21c28386e299d1a9fae8051d35ad180e33109"
    +  integrity sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==
    +  dependencies:
    +    "@gar/promisify" "^1.1.3"
    +    semver "^7.3.5"
    +
    +"@npmcli/move-file@^2.0.0":
    +  version "2.0.0"
    +  resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.0.tgz#417f585016081a0184cef3e38902cd917a9bbd02"
    +  integrity sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==
    +  dependencies:
    +    mkdirp "^1.0.4"
    +    rimraf "^3.0.2"
    +
     "@postlight/ci-failed-test-reporter@^1.0":
       version "1.0.26"
       resolved "https://registry.yarnpkg.com/@postlight/ci-failed-test-reporter/-/ci-failed-test-reporter-1.0.26.tgz#dbb8a07bf2e500476dc6bac0611aac2c8fbbe567"
    @@ -2575,6 +2596,23 @@ agentkeepalive@^2.2.0:
       resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-2.2.0.tgz#c5d1bd4b129008f1163f236f86e5faea2026e2ef"
       integrity sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=
     
    +agentkeepalive@^4.2.1:
    +  version "4.2.1"
    +  resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717"
    +  integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==
    +  dependencies:
    +    debug "^4.1.0"
    +    depd "^1.1.2"
    +    humanize-ms "^1.2.1"
    +
    +aggregate-error@^3.0.0:
    +  version "3.1.0"
    +  resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
    +  integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
    +  dependencies:
    +    clean-stack "^2.0.0"
    +    indent-string "^4.0.0"
    +
     ajv-errors@^1.0.0:
       version "1.0.1"
       resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
    @@ -2723,6 +2761,14 @@ are-we-there-yet@^2.0.0:
         delegates "^1.0.0"
         readable-stream "^3.6.0"
     
    +are-we-there-yet@^3.0.0:
    +  version "3.0.0"
    +  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d"
    +  integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==
    +  dependencies:
    +    delegates "^1.0.0"
    +    readable-stream "^3.6.0"
    +
     are-we-there-yet@~1.1.2:
       version "1.1.7"
       resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146"
    @@ -3261,6 +3307,13 @@ brace-expansion@^1.1.7:
         balanced-match "^1.0.0"
         concat-map "0.0.1"
     
    +brace-expansion@^2.0.1:
    +  version "2.0.1"
    +  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
    +  integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
    +  dependencies:
    +    balanced-match "^1.0.0"
    +
     braces@^2.3.1, braces@^2.3.2:
       version "2.3.2"
       resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
    @@ -3479,6 +3532,30 @@ cacache@^12.0.2, cacache@^12.0.3:
         unique-filename "^1.1.1"
         y18n "^4.0.0"
     
    +cacache@^16.1.0:
    +  version "16.1.1"
    +  resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.1.tgz#4e79fb91d3efffe0630d5ad32db55cc1b870669c"
    +  integrity sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==
    +  dependencies:
    +    "@npmcli/fs" "^2.1.0"
    +    "@npmcli/move-file" "^2.0.0"
    +    chownr "^2.0.0"
    +    fs-minipass "^2.1.0"
    +    glob "^8.0.1"
    +    infer-owner "^1.0.4"
    +    lru-cache "^7.7.1"
    +    minipass "^3.1.6"
    +    minipass-collect "^1.0.2"
    +    minipass-flush "^1.0.5"
    +    minipass-pipeline "^1.2.4"
    +    mkdirp "^1.0.4"
    +    p-map "^4.0.0"
    +    promise-inflight "^1.0.1"
    +    rimraf "^3.0.2"
    +    ssri "^9.0.0"
    +    tar "^6.1.11"
    +    unique-filename "^1.1.1"
    +
     cache-base@^1.0.1:
       version "1.0.1"
       resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
    @@ -3860,6 +3937,11 @@ clean-css@4.2.x:
       dependencies:
         source-map "~0.6.0"
     
    +clean-stack@^2.0.0:
    +  version "2.2.0"
    +  resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
    +  integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
    +
     cli-boxes@^2.2.0, cli-boxes@^2.2.1:
       version "2.2.1"
       resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
    @@ -3982,7 +4064,7 @@ color-string@^1.6.0:
         color-name "^1.0.0"
         simple-swizzle "^0.2.2"
     
    -color-support@^1.1.2:
    +color-support@^1.1.2, color-support@^1.1.3:
       version "1.1.3"
       resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
       integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
    @@ -4833,7 +4915,7 @@ depd@2.0.0, depd@^2.0.0, depd@~2.0.0:
       resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
       integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
     
    -depd@~1.1.2:
    +depd@^1.1.2, depd@~1.1.2:
       version "1.1.2"
       resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
       integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
    @@ -5254,6 +5336,13 @@ encoding-japanese@2.0.0:
       resolved "https://registry.yarnpkg.com/encoding-japanese/-/encoding-japanese-2.0.0.tgz#fa0226e5469e7b5b69a04fea7d5481bd1fa56936"
       integrity sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==
     
    +encoding@^0.1.13:
    +  version "0.1.13"
    +  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
    +  integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
    +  dependencies:
    +    iconv-lite "^0.6.2"
    +
     end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
       version "1.4.4"
       resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
    @@ -5304,6 +5393,11 @@ entities@^4.2.0, entities@^4.3.0:
       resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.0.tgz#62915f08d67353bb4eb67e3d62641a4059aec656"
       integrity sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==
     
    +env-paths@^2.2.0:
    +  version "2.2.1"
    +  resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
    +  integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
    +
     envify@^4.0.0:
       version "4.1.0"
       resolved "https://registry.yarnpkg.com/envify/-/envify-4.1.0.tgz#f39ad3db9d6801b4e6b478b61028d3f0b6819f7e"
    @@ -5317,6 +5411,11 @@ envinfo@^7.2.0:
       resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
       integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
     
    +err-code@^2.0.2:
    +  version "2.0.3"
    +  resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9"
    +  integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==
    +
     errno@^0.1.3, errno@~0.1.7:
       version "0.1.8"
       resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
    @@ -6304,7 +6403,7 @@ fs-minipass@^1.2.7:
       dependencies:
         minipass "^2.6.0"
     
    -fs-minipass@^2.0.0:
    +fs-minipass@^2.0.0, fs-minipass@^2.1.0:
       version "2.1.0"
       resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
       integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
    @@ -6387,6 +6486,20 @@ gauge@^3.0.0:
         strip-ansi "^6.0.1"
         wide-align "^1.1.2"
     
    +gauge@^4.0.3:
    +  version "4.0.4"
    +  resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
    +  integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
    +  dependencies:
    +    aproba "^1.0.3 || ^2.0.0"
    +    color-support "^1.1.3"
    +    console-control-strings "^1.1.0"
    +    has-unicode "^2.0.1"
    +    signal-exit "^3.0.7"
    +    string-width "^4.2.3"
    +    strip-ansi "^6.0.1"
    +    wide-align "^1.1.5"
    +
     gauge@~2.7.3:
       version "2.7.4"
       resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
    @@ -6569,6 +6682,17 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
         once "^1.3.0"
         path-is-absolute "^1.0.0"
     
    +glob@^8.0.1:
    +  version "8.0.3"
    +  resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e"
    +  integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==
    +  dependencies:
    +    fs.realpath "^1.0.0"
    +    inflight "^1.0.4"
    +    inherits "2"
    +    minimatch "^5.0.1"
    +    once "^1.3.0"
    +
     global-dirs@^2.0.1:
       version "2.1.0"
       resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d"
    @@ -6742,7 +6866,7 @@ graceful-fs@4.1.15:
       resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
       integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
     
    -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9:
    +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
       version "4.2.10"
       resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
       integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
    @@ -7061,7 +7185,7 @@ http-assert@^1.3.0:
         deep-equal "~1.0.1"
         http-errors "~1.8.0"
     
    -http-cache-semantics@^4.0.0:
    +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0:
       version "4.1.0"
       resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
       integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
    @@ -7246,6 +7370,13 @@ human-signals@^2.1.0:
       resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
       integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
     
    +humanize-ms@^1.2.1:
    +  version "1.2.1"
    +  resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
    +  integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
    +  dependencies:
    +    ms "^2.0.0"
    +
     iconv-lite@0.4.24, iconv-lite@^0.4.4:
       version "0.4.24"
       resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
    @@ -7260,7 +7391,7 @@ iconv-lite@0.5.0:
       dependencies:
         safer-buffer ">= 2.1.2 < 3"
     
    -iconv-lite@0.6.3:
    +iconv-lite@0.6.3, iconv-lite@^0.6.2:
       version "0.6.3"
       resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
       integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
    @@ -7382,12 +7513,17 @@ imurmurhash@^0.1.4:
       resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
       integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
     
    +indent-string@^4.0.0:
    +  version "4.0.0"
    +  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
    +  integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
    +
     indexes-of@^1.0.1:
       version "1.0.1"
       resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
       integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
     
    -infer-owner@^1.0.3:
    +infer-owner@^1.0.3, infer-owner@^1.0.4:
       version "1.0.4"
       resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
       integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
    @@ -7457,6 +7593,11 @@ instagram-private-api@1.45.3:
         url-regex-safe "^3.0.0"
         utility-types "^3.10.0"
     
    +install-artifact-from-github@^1.3.1:
    +  version "1.3.1"
    +  resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.1.tgz#eefaad9af35d632e5d912ad1569c1de38c3c2462"
    +  integrity sha512-3l3Bymg2eKDsN5wQuMfgGEj2x6l5MCAv0zPL6rxHESufFVlEAKW/6oY9F1aGgvY/EgWm5+eWGRjINveL4X7Hgg==
    +
     internal-ip@^4.3.0:
       version "4.3.0"
       resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
    @@ -7781,6 +7922,11 @@ is-keyword-js@^1.0.3:
       resolved "https://registry.yarnpkg.com/is-keyword-js/-/is-keyword-js-1.0.3.tgz#ac30dcf35b671f4b27b17f5cb57235126021132d"
       integrity sha1-rDDc81tnH0snsX9ctXI1EmAhEy0=
     
    +is-lambda@^1.0.1:
    +  version "1.0.1"
    +  resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
    +  integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==
    +
     is-localhost-ip@1.4.0:
       version "1.4.0"
       resolved "https://registry.yarnpkg.com/is-localhost-ip/-/is-localhost-ip-1.4.0.tgz#dd66aaabcbb5dbbc943e00adad5f715d2c3b3a1d"
    @@ -9080,7 +9226,7 @@ lowercase-keys@^2.0.0:
       resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
       integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
     
    -lru-cache@7.10.1:
    +lru-cache@7.10.1, lru-cache@^7.7.1:
       version "7.10.1"
       resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab"
       integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A==
    @@ -9169,6 +9315,28 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0:
       dependencies:
         semver "^6.0.0"
     
    +make-fetch-happen@^10.0.3:
    +  version "10.1.8"
    +  resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.8.tgz#3b6e93dd8d8fdb76c0d7bf32e617f37c3108435a"
    +  integrity sha512-0ASJbG12Au6+N5I84W+8FhGS6iM8MyzvZady+zaQAu+6IOaESFzCLLD0AR1sAFF3Jufi8bxm586ABN6hWd3k7g==
    +  dependencies:
    +    agentkeepalive "^4.2.1"
    +    cacache "^16.1.0"
    +    http-cache-semantics "^4.1.0"
    +    http-proxy-agent "^5.0.0"
    +    https-proxy-agent "^5.0.0"
    +    is-lambda "^1.0.1"
    +    lru-cache "^7.7.1"
    +    minipass "^3.1.6"
    +    minipass-collect "^1.0.2"
    +    minipass-fetch "^2.0.3"
    +    minipass-flush "^1.0.5"
    +    minipass-pipeline "^1.2.4"
    +    negotiator "^0.6.3"
    +    promise-retry "^2.0.1"
    +    socks-proxy-agent "^7.0.0"
    +    ssri "^9.0.0"
    +
     makeerror@1.0.12:
       version "1.0.12"
       resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
    @@ -9587,11 +9755,57 @@ minimatch@^3.0.4, minimatch@^3.1.2:
       dependencies:
         brace-expansion "^1.1.7"
     
    +minimatch@^5.0.1:
    +  version "5.1.0"
    +  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7"
    +  integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==
    +  dependencies:
    +    brace-expansion "^2.0.1"
    +
     minimist@^1.2.0, minimist@^1.2.6:
       version "1.2.6"
       resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
       integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
     
    +minipass-collect@^1.0.2:
    +  version "1.0.2"
    +  resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
    +  integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
    +  dependencies:
    +    minipass "^3.0.0"
    +
    +minipass-fetch@^2.0.3:
    +  version "2.1.0"
    +  resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.0.tgz#ca1754a5f857a3be99a9271277246ac0b44c3ff8"
    +  integrity sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==
    +  dependencies:
    +    minipass "^3.1.6"
    +    minipass-sized "^1.0.3"
    +    minizlib "^2.1.2"
    +  optionalDependencies:
    +    encoding "^0.1.13"
    +
    +minipass-flush@^1.0.5:
    +  version "1.0.5"
    +  resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
    +  integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
    +  dependencies:
    +    minipass "^3.0.0"
    +
    +minipass-pipeline@^1.2.4:
    +  version "1.2.4"
    +  resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
    +  integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
    +  dependencies:
    +    minipass "^3.0.0"
    +
    +minipass-sized@^1.0.3:
    +  version "1.0.3"
    +  resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70"
    +  integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==
    +  dependencies:
    +    minipass "^3.0.0"
    +
     minipass@^2.6.0, minipass@^2.9.0:
       version "2.9.0"
       resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
    @@ -9607,14 +9821,21 @@ minipass@^3.0.0:
       dependencies:
         yallist "^4.0.0"
     
    +minipass@^3.1.1, minipass@^3.1.6:
    +  version "3.3.3"
    +  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.3.tgz#fd1f0e6c06449c10dadda72618b59c00f3d6378d"
    +  integrity sha512-N0BOsdFAlNRfmwMhjAsLVWOk7Ljmeb39iqFlsV1At+jqRhSUP9yeof8FyJu4imaJiSUp8vQebWD/guZwGQC8iA==
    +  dependencies:
    +    yallist "^4.0.0"
    +
     minizlib@^1.3.3:
       version "1.3.3"
       resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
       integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
       dependencies:
         minipass "^2.9.0"
     
    -minizlib@^2.1.1:
    +minizlib@^2.1.1, minizlib@^2.1.2:
       version "2.1.2"
       resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
       integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
    @@ -9671,7 +9892,7 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1:
       dependencies:
         minimist "^1.2.6"
     
    -mkdirp@^1.0.3, mkdirp@~1.0.4:
    +mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4:
       version "1.0.4"
       resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
       integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
    @@ -9740,7 +9961,7 @@ ms@2.1.2:
       resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
       integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
     
    -ms@2.1.3, ms@^2.1.1:
    +ms@2.1.3, ms@^2.0.0, ms@^2.1.1:
       version "2.1.3"
       resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
       integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
    @@ -9783,6 +10004,11 @@ nan@^2.12.1:
       resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
       integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
     
    +nan@^2.16.0:
    +  version "2.16.0"
    +  resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916"
    +  integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==
    +
     nanomatch@^1.2.9:
       version "1.2.13"
       resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
    @@ -9824,7 +10050,7 @@ needle@^2.2.1:
         iconv-lite "^0.4.4"
         sax "^1.2.4"
     
    -negotiator@0.6.3:
    +negotiator@0.6.3, negotiator@^0.6.3:
       version "0.6.3"
       resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
       integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
    @@ -9893,6 +10119,22 @@ node-gyp-build@^4.2.2:
       resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4"
       integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==
     
    +node-gyp@^9.0.0:
    +  version "9.0.0"
    +  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.0.0.tgz#e1da2067427f3eb5bb56820cb62bc6b1e4bd2089"
    +  integrity sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==
    +  dependencies:
    +    env-paths "^2.2.0"
    +    glob "^7.1.4"
    +    graceful-fs "^4.2.6"
    +    make-fetch-happen "^10.0.3"
    +    nopt "^5.0.0"
    +    npmlog "^6.0.0"
    +    rimraf "^3.0.2"
    +    semver "^7.3.5"
    +    tar "^6.1.2"
    +    which "^2.0.2"
    +
     node-int64@^0.4.0:
       version "0.4.0"
       resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
    @@ -10092,6 +10334,16 @@ npmlog@^5.0.1:
         gauge "^3.0.0"
         set-blocking "^2.0.0"
     
    +npmlog@^6.0.0:
    +  version "6.0.2"
    +  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830"
    +  integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==
    +  dependencies:
    +    are-we-there-yet "^3.0.0"
    +    console-control-strings "^1.1.0"
    +    gauge "^4.0.3"
    +    set-blocking "^2.0.0"
    +
     nprogress@^0.2.0:
       version "0.2.0"
       resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
    @@ -10375,6 +10627,13 @@ p-map@^2.0.0:
       resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
       integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
     
    +p-map@^4.0.0:
    +  version "4.0.0"
    +  resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
    +  integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
    +  dependencies:
    +    aggregate-error "^3.0.0"
    +
     p-retry@^3.0.1:
       version "3.0.1"
       resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
    @@ -11196,6 +11455,14 @@ promise-inflight@^1.0.1:
       resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
       integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
     
    +promise-retry@^2.0.1:
    +  version "2.0.1"
    +  resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22"
    +  integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==
    +  dependencies:
    +    err-code "^2.0.2"
    +    retry "^0.12.0"
    +
     prompts@^2.0.1:
       version "2.4.2"
       resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
    @@ -11529,6 +11796,15 @@ rc@^1.2.7, rc@^1.2.8:
         minimist "^1.2.0"
         strip-json-comments "~2.0.1"
     
    +re2@1.17.7:
    +  version "1.17.7"
    +  resolved "https://registry.yarnpkg.com/re2/-/re2-1.17.7.tgz#e14cab85a177a5534c7215c322d1b043c55aa1e9"
    +  integrity sha512-X8GSuiBoVWwcjuppqSjsIkRxNUKDdjhkO9SBekQbZ2ksqWUReCy7DQPWOVpoTnpdtdz5PIpTTxTFzvJv5UMfjA==
    +  dependencies:
    +    install-artifact-from-github "^1.3.1"
    +    nan "^2.16.0"
    +    node-gyp "^9.0.0"
    +
     react-is@^18.0.0:
       version "18.1.0"
       resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67"
    @@ -12413,7 +12689,7 @@ socks-proxy-agent@5, socks-proxy-agent@^5.0.0:
         debug "4"
         socks "^2.3.3"
     
    -socks-proxy-agent@7.0.0:
    +socks-proxy-agent@7.0.0, socks-proxy-agent@^7.0.0:
       version "7.0.0"
       resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6"
       integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==
    @@ -12556,6 +12832,13 @@ ssri@^6.0.1:
       dependencies:
         figgy-pudding "^3.5.1"
     
    +ssri@^9.0.0:
    +  version "9.0.1"
    +  resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057"
    +  integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==
    +  dependencies:
    +    minipass "^3.1.1"
    +
     stable@^0.1.8:
       version "0.1.8"
       resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
    @@ -13024,7 +13307,7 @@ tar@^4:
         safe-buffer "^5.2.1"
         yallist "^3.1.1"
     
    -tar@^6.1.11:
    +tar@^6.1.11, tar@^6.1.2:
       version "6.1.11"
       resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
       integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
    @@ -13982,8 +14265,10 @@ watchpack@^1.7.4:
       resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453"
       integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==
       dependencies:
    +    chokidar "^3.4.1"
         graceful-fs "^4.1.2"
         neo-async "^2.5.0"
    +    watchpack-chokidar2 "^2.0.1"
       optionalDependencies:
         chokidar "^3.4.1"
         watchpack-chokidar2 "^2.0.1"
    @@ -14242,14 +14527,14 @@ which@^1.2.9:
       dependencies:
         isexe "^2.0.0"
     
    -which@^2.0.1:
    +which@^2.0.1, which@^2.0.2:
       version "2.0.2"
       resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
       integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
       dependencies:
         isexe "^2.0.0"
     
    -wide-align@^1.1.0, wide-align@^1.1.2:
    +wide-align@^1.1.0, wide-align@^1.1.2, wide-align@^1.1.5:
       version "1.1.5"
       resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
       integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
    
4671720f4c5e

feat: add filter_case_sensitive url parameter (#3910)

https://github.com/diygod/rsshubpnlngFeb 9, 2020via ghsa
4 files changed · +125 6
  • docs/en/parameter.md+6 0 modified
    @@ -36,6 +36,12 @@ Set `filterout` to exclude unwanted content.
     
     For example: [https://rsshub.app/dribbble/popular?filterout=Blue|Yellow|Black](https://rsshub.app/dribbble/popular?filterout=Blue|Yellow|Black)
     
    +Set `filter_case_sensitive` to determine whether the filtering keywords should be case sensitive. The parameter would apply to both `filter` and `filterout`.
    +
    +Default: `true`
    +
    +Example: [https://rsshub.app/dribbble/popular?filter=BluE|yeLLow|BlaCK&filter_case_sensitive=false](https://rsshub.app/dribbble/popular?filter=BluE|yeLLow|BlaCK&filter_case_sensitive=false)
    +
     ### Limit Entries
     
     Set `limit` to limit the number of articles in the feed.
    
  • docs/parameter.md+6 0 modified
    @@ -37,6 +37,12 @@ filterout 去掉不要的内容
     
     举例: <https://rsshub.app/bilibili/user/coin/2267573?filterout=微小微|赤九玖|暴走大事件>
     
    +filter_case_sensitive 过滤是否区分大小写,filter 和 filterout 同时适用
    +
    +默认为 true,区分大小写
    +
    +举例 1: <https://rsshub.app/bilibili/user/coin/2267573?filter=diyGOD|RSShub&filter_case_sensitive=false>
    +
     ## 条数限制
     
     可以使用 limit 参数限制最大条数, 主要用于排行榜类 RSS
    
  • lib/middleware/parameter.js+15 6 modified
    @@ -121,6 +121,15 @@ module.exports = async (ctx, next) => {
                 }
     
                 // filter
    +            const makeRegex = (string) => {
    +                // default: case_senstivie = true
    +                if (ctx.query.filter_case_sensitive === 'false') {
    +                    return new RegExp(string, 'i');
    +                } else {
    +                    return new RegExp(string);
    +                }
    +            };
    +
                 if (ctx.query.filter || ctx.query.filter_title || ctx.query.filter_description || ctx.query.filter_author) {
                     if (ctx.query.filter) {
                         ctx.query.filter_title = ctx.query.filter;
    @@ -131,9 +140,9 @@ module.exports = async (ctx, next) => {
                         const description = item.description || title;
                         const author = item.author || '';
                         let isFilter = true;
    -                    ctx.query.filter_title && (isFilter = isFilter && !title.match(ctx.query.filter_title));
    -                    ctx.query.filter_description && (isFilter = isFilter && !description.match(ctx.query.filter_description));
    -                    ctx.query.filter_author && (isFilter = isFilter && !author.match(ctx.query.filter_author));
    +                    ctx.query.filter_title && (isFilter = isFilter && !title.match(makeRegex(ctx.query.filter_title)));
    +                    ctx.query.filter_description && (isFilter = isFilter && !description.match(makeRegex(ctx.query.filter_description)));
    +                    ctx.query.filter_author && (isFilter = isFilter && !author.match(makeRegex(ctx.query.filter_author)));
                         return !isFilter;
                     });
                 }
    @@ -148,9 +157,9 @@ module.exports = async (ctx, next) => {
                         const description = item.description || title;
                         const author = item.author || '';
                         let isFilter = true;
    -                    ctx.query.filterout_title && (isFilter = isFilter && !title.match(ctx.query.filterout_title));
    -                    ctx.query.filterout_description && (isFilter = isFilter && !description.match(ctx.query.filterout_description));
    -                    ctx.query.filterout_author && (isFilter = isFilter && !author.match(ctx.query.filterout_author));
    +                    ctx.query.filterout_title && (isFilter = isFilter && !title.match(makeRegex(ctx.query.filterout_title)));
    +                    ctx.query.filterout_description && (isFilter = isFilter && !description.match(makeRegex(ctx.query.filterout_description)));
    +                    ctx.query.filterout_author && (isFilter = isFilter && !author.match(makeRegex(ctx.query.filterout_author)));
                         return isFilter;
                     });
                 }
    
  • test/middleware/parameter.js+98 0 modified
    @@ -19,20 +19,48 @@ describe('filter', () => {
             expect(parsed.items[1].title).toBe('Title5');
         });
     
    +    it(`filter filter_case_sensitive default`, async () => {
    +        const response = await request.get('/test/1?filter=description4|title5');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(0);
    +    });
    +
    +    it(`filter filter_case_sensitive=false`, async () => {
    +        const response = await request.get('/test/1?filter=description4|title5&filter_case_sensitive=false');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(2);
    +        expect(parsed.items[0].title).toBe('Title4');
    +        expect(parsed.items[1].title).toBe('Title5');
    +    });
    +
         it(`filter_title`, async () => {
             const response = await request.get('/test/1?filter_title=Description4|Title5');
             const parsed = await parser.parseString(response.text);
             expect(parsed.items.length).toBe(1);
             expect(parsed.items[0].title).toBe('Title5');
         });
     
    +    it(`filter_title filter_case_sensitive=false`, async () => {
    +        const response = await request.get('/test/1?filter_title=description4|title5&filter_case_sensitive=false');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(1);
    +        expect(parsed.items[0].title).toBe('Title5');
    +    });
    +
         it(`filter_description`, async () => {
             const response = await request.get('/test/1?filter_description=Description4|Title5');
             const parsed = await parser.parseString(response.text);
             expect(parsed.items.length).toBe(1);
             expect(parsed.items[0].title).toBe('Title4');
         });
     
    +    it(`filter_description filter_case_sensitive=false`, async () => {
    +        const response = await request.get('/test/1?filter_description=description4|title5&filter_case_sensitive=false');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(1);
    +        expect(parsed.items[0].title).toBe('Title4');
    +    });
    +
         it(`filter_author`, async () => {
             const response = await request.get('/test/1?filter_author=DIYgod4|DIYgod5');
             const parsed = await parser.parseString(response.text);
    @@ -41,6 +69,20 @@ describe('filter', () => {
             expect(parsed.items[1].title).toBe('Title5');
         });
     
    +    it(`filter_author filter_case_sensitive default`, async () => {
    +        const response = await request.get('/test/1?filter_author=diygod4|diygod5');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(0);
    +    });
    +
    +    it(`filter_author filter_case_sensitive=false`, async () => {
    +        const response = await request.get('/test/1?filter_author=diygod4|diygod5&filter_case_sensitive=false');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(2);
    +        expect(parsed.items[0].title).toBe('Title4');
    +        expect(parsed.items[1].title).toBe('Title5');
    +    });
    +
         it(`filter_time`, async () => {
             const response = await request.get('/test/current_time?filter_time=25');
             const parsed = await parser.parseString(response.text);
    @@ -58,6 +100,24 @@ describe('filter', () => {
             expect(parsed.items[2].title).toBe('Title3');
         });
     
    +    it(`filterout filter_case_sensitive default`, async () => {
    +        const response = await request.get('/test/1?filterout=description4|title5');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(5);
    +        expect(parsed.items[0].title).toBe('Title1');
    +        expect(parsed.items[1].title).toBe('Title2');
    +        expect(parsed.items[2].title).toBe('Title3');
    +    });
    +
    +    it(`filterout filter_case_sensitive=false`, async () => {
    +        const response = await request.get('/test/1?filterout=description4|title5&filter_case_sensitive=false');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(3);
    +        expect(parsed.items[0].title).toBe('Title1');
    +        expect(parsed.items[1].title).toBe('Title2');
    +        expect(parsed.items[2].title).toBe('Title3');
    +    });
    +
         it(`filterout_title`, async () => {
             const response = await request.get('/test/1?filterout_title=Description4|Title5');
             const parsed = await parser.parseString(response.text);
    @@ -68,6 +128,16 @@ describe('filter', () => {
             expect(parsed.items[3].title).toBe('Title4');
         });
     
    +    it(`filterout_title filter_case_sensitive=false`, async () => {
    +        const response = await request.get('/test/1?filterout_title=description4|title5&filter_case_sensitive=false');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(4);
    +        expect(parsed.items[0].title).toBe('Title1');
    +        expect(parsed.items[1].title).toBe('Title2');
    +        expect(parsed.items[2].title).toBe('Title3');
    +        expect(parsed.items[3].title).toBe('Title4');
    +    });
    +
         it(`filterout_description`, async () => {
             const response = await request.get('/test/1?filterout_description=Description4|Title5');
             const parsed = await parser.parseString(response.text);
    @@ -78,6 +148,16 @@ describe('filter', () => {
             expect(parsed.items[3].title).toBe('Title5');
         });
     
    +    it(`filterout_description filter_case_sensitive=false`, async () => {
    +        const response = await request.get('/test/1?filterout_description=description4|title5&filter_case_sensitive=false');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(4);
    +        expect(parsed.items[0].title).toBe('Title1');
    +        expect(parsed.items[1].title).toBe('Title2');
    +        expect(parsed.items[2].title).toBe('Title3');
    +        expect(parsed.items[3].title).toBe('Title5');
    +    });
    +
         it(`filterout_author`, async () => {
             const response = await request.get('/test/1?filterout_author=DIYgod4|DIYgod5');
             const parsed = await parser.parseString(response.text);
    @@ -86,6 +166,24 @@ describe('filter', () => {
             expect(parsed.items[1].title).toBe('Title2');
             expect(parsed.items[2].title).toBe('Title3');
         });
    +
    +    it(`filterout_author filter_case_sensitive default`, async () => {
    +        const response = await request.get('/test/1?filterout_author=diygod4|diygod5');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(5);
    +        expect(parsed.items[0].title).toBe('Title1');
    +        expect(parsed.items[1].title).toBe('Title2');
    +        expect(parsed.items[2].title).toBe('Title3');
    +    });
    +
    +    it(`filterout_author filter_case_sensitive=false`, async () => {
    +        const response = await request.get('/test/1?filterout_author=diygod4|diygod5&filter_case_sensitive=false');
    +        const parsed = await parser.parseString(response.text);
    +        expect(parsed.items.length).toBe(3);
    +        expect(parsed.items[0].title).toBe('Title1');
    +        expect(parsed.items[1].title).toBe('Title2');
    +        expect(parsed.items[2].title).toBe('Title3');
    +    });
     });
     
     describe('limit', () => {
    

Vulnerability mechanics

Root cause

"Using JavaScript's built-in regular expression engine for user-supplied `filter` and `filterout` parameters allows crafted input to trigger catastrophic backtracking, causing excessive CPU consumption."

Attack vector

An attacker sends HTTP requests to an RSSHub instance with specially crafted values in the `filter` or `filterout` query parameters. These values trigger catastrophic backtracking in the JavaScript regular expression engine, causing abnormally high CPU consumption. The attack requires no authentication and can be performed over the network by any client that can reach the RSSHub service. The high CPU load degrades server performance and can lead to a denial of service for legitimate users.

Affected code

The patch modifies `yarn.lock` to add the `re2` native module dependency and its transitive dependencies (e.g., `nan@^2.16.0`, `node-gyp@^9.0.0`). The commit message states "fix: use re2", indicating the code that processes the `filter` and `filterout` parameters previously used JavaScript's built-in regular expressions (which can exhibit catastrophic backtracking on crafted input) and is being replaced with the `re2` library, which provides bounded-time regex matching.

What the fix does

The patch switches the regular expression engine used for `filter` and `filterout` parameter processing from JavaScript's native `RegExp` to the `re2` library. The `re2` library implements Google's RE2 algorithm, which guarantees linear-time matching and eliminates the possibility of catastrophic backtracking. By adding `re2` and its native dependencies (via `nan`, `node-gyp`, etc.) to `yarn.lock`, the project ensures that all regex operations on user-supplied filter patterns complete in bounded time, preventing the CPU exhaustion that crafted inputs could previously trigger.

Preconditions

  • networkThe attacker must be able to send HTTP requests to an RSSHub instance.
  • configThe RSSHub instance must be running a version prior to commit 5c4177441417.
  • authNo authentication is required to reach the vulnerable filter/filterout endpoints.

Generated on May 23, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

6

News mentions

0

No linked articles in our index yet.