CVE-2025-49844: Redis Lua Parser < 8.2.2 - Use After Free

2025-08-01 Redis Lua Parser PoC Public

Description

Redis is an open source, in-memory database that persists on disk. Versions 8.2.1 and below allow an authenticated user to use a specially crafted Lua script to manipulate the garbage collector, trigger a use-after-free and potentially lead to remote code execution. The problem exists in all versions of Redis with Lua scripting. This issue is fixed in version 8.2.2. To workaround this issue without patching the redis-server executable is to prevent users from executing Lua scripts. This can be done using ACL to restrict EVAL and EVALSHA commands.

PoC

id: CVE-2025-49844

info:
  name: Redis Lua Parser < 8.2.2 - Use After Free
  author: pussycat0x
  severity: critical
  description: |
    Redis is an open source, in-memory database that persists on disk. Versions 8.2.1 and below allow an authenticated user to use a specially crafted Lua script to manipulate the garbage collector, trigger a use-after-free and potentially lead to remote code execution. The problem exists in all versions of Redis with Lua scripting. This issue is fixed in version 8.2.2. To workaround this issue without patching the redis-server executable is to prevent users from executing Lua scripts. This can be done using ACL to restrict EVAL and EVALSHA commands.
  remediation: |
    Upgrade to version 8.2.2 or later.
  reference:
    - https://www.wiz.io/blog/wiz-research-redis-rce-cve-2025-49844
    - https://github.com/dwisiswant0/CVE-2025-49844
  metadata:
    verified: true
    max-request: 1
    shodan-query: product:"redis"
  tags: cve,cve2025,js,redis,network,passive,authenticated,vuln

flow: javascript(1) && javascript(2)

javascript:
  - pre-condition: |
      isPortOpen(Host,Port);

    code: |
      const redis = require('nuclei/redis');
      const info = redis.GetServerInfo(Host,Port);
      Export(info);

    args:
      Host: "{{Host}}"
      Port: "6379"

    matchers:
      - type: dsl
        dsl:
          - success == true
          - compare_versions(version, ' < 8.2.2')
        condition: and


    extractors:
      - type: regex
        name: version
        part: response
        group: 1
        regex:
          - redis_version:(\d+\.\d+\.\d+)

  - code: |
      const redis = require('nuclei/redis');
      const info = redis.RunLuaScript(Host,Port,Password,Payload);
      Export(info);

    args:
      Host: "{{Host}}"
      Port: "6379"
      Password: "{{passwords}}"
      Payload: 'return "lua enabled"'

    payloads:
      passwords:
        - ""

    matchers:
      - type: dsl
        dsl:
          - success == true
          - contains(response, 'lua enabled')
        condition: and
        internal: true
# digest: 4a0a00473045022100aa562c0d8e3c1ddd8a01163059814b1727717e118c79cd643d4f1a7e68d84f8d02202465b34f0964d37b3b5745427124324888aaa28aac686523a4b2dc4f2a128d3d:922c64590222798bb761d5b6d8e72950

# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.

References

Related Vulnerabilities