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
spark-rpc-stream-unauth — Apache Spark 4.2.0 - Alta - Remoto - Leitura de arquivo - RPC StreamRequest File join não autenticado | Kitploit
Ferramentas/GitHubGitHub/abraxas/spark-rpc-stream-unauth
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebColeta de InformaçõesSegurança de RedeTestes de PenetraçãoPapers e PesquisaLabs e Prática
GitHubabraxas/spark-rpc-stream-unauth

spark-rpc-stream-unauth

Apache Spark 4.2.0 - Alta - Remoto - Leitura de arquivo - RPC StreamRequest File join não autenticado

8há 2 diasAinda não revisado
Ver Repositório

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

Abraxas Labs - spark-rpc-stream-unauth

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  spark-rpc-stream-unauth

spark-rpc-stream-unauth

Classe: Privilégio remanescente / Leitura de arquivo Alcance: Remoto

Apache Spark 4.2.0 (32f72996) - Apache Software Foundation

CVE-2020-9480 fechou RequestSubmitDriver / RegisterApplication não autenticados no plano de controle RPC. AbstractAuthRpcHandler protege receive() e receiveStream(). Ele não protege getStreamManager(). TransportRequestHandler ainda despacha StreamRequest para esse gerenciador antes do SASL. NettyStreamManager.openStream faz new File(dir, fname) sem verificação de permanência na raiz.

StreamRequest não autenticado classes/../../path lê arquivos Spark-UID. Filhos absolutos Unix permanecem sob o diretório registrado (lab 404). files/ é um get de mapa (404). receive() / receiveStream() permanecem 401. Isto não é RCE do 9480.

IDsem CVE ainda
ClassePrivilégio remanescente / Leitura de arquivo (remanescente do plano de dados RPC sem proteção do CVE-2020-9480)
AlcanceRemoto (TCP não autenticado para um driver RpcEnv / ESS / BlockManager com spark.authenticate=true)
CWECWE-862, CWE-22
CVSSAlto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
ProdutoApache Spark
Afetado4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8). spark.authenticate=true habilitado pelo operador. A leitura de arquivo do host precisa de um diretório registrado (spark.repl.class.outputDir /classes e/ou artifacts do Connect).
Autenticaçãonenhuma em StreamRequest / getStreamManager()
LicençaGNU Affero GPL v3.0
Labapenas 127.0.0.1

O que um atacante pode fazer

TCP para uma porta RPC do Spark que tenha spark.authenticate=true e um diretório registrado. Sem segredo compartilhado. Sem spark.network.crypto.enabled. Envie um StreamRequest de transporte (tipo de mensagem 6) com streamId classes/../../<path>. TransportRequestHandler.processStreamRequest nunca chama RpcHandler.receive. Ele chama getStreamManager().openStream. O wrapper do 9480 retorna o gerenciador real. new File(dir, "../../oracle/secret") canonicaliza para fora da raiz do REPL/artifact e retorna como FileSegmentManagedBuffer.

Isso é uma leitura de arquivo do host como o UID do Spark. Não é submissão de job. Não é RequestSubmitDriver. Não é um shell.

Confidencialidade (comprovada em lab)

MétodoSinkPrivilégio
StreamRequest não autenticado classes/../../<path>NettyStreamManager.openStream new File(dir, fname) e então FileSegmentManagedBufferLê arquivos Spark-UID que o driver consegue abrir. Comprovado em lab: opened /opt/repl-classes/../../oracle/secret, canônico /oracle/secret, corpo SPARK-RPC-STREAM-UNAUTH-WITNESS, x-auth-gated=false, x-authenticated=false.
StreamRequest não autenticado classes/hello.txt (controle dentro do diretório)mesma junção, permanece sob o diretório registradoLê um arquivo que está de fato sob /classes. Comprovado em lab 200 IN-DIR-OK, sem witness. Confirma que o servidor de arquivos funciona sem SASL mesmo para um nome contido.

Confidencialidade (inferida)

MétodoSinkPrivilégio
ChunkFetchRequest / StreamRequest não autenticado de um streamId ESS ativoOneForOneStreamManager.getChunk / openStream. checkAuthorization é ignorado quando client.getClientId() == nullLê bytes de shuffle / disk-RDD em trânsito de outro app. Disponibilidade: o drain avança curChunk. Precisa de um streamId ativo (início aleatório, depois +1). O gadget não falava com ESS ativo.
MergedBlockMetaRequest não autenticadoAbstractAuthRpcHandler.getMergedBlockMetaReqHandler() também sem proteçãoLê bitmaps de chunk de shuffle mesclado para um appId escolhido quando o ESS tem merged shuffle. Mesmo skip de clientId nulo. Não exercitado.

Fechado neste remanescente (comprovado em lab)

MétodoSinkPermanece fechado
StreamRequest não autenticado classes//oracle/secret (filho absoluto Unix)new File(dir, "/oracle/secret")404. O caminho aberto é /opt/repl-classes/oracle/secret. O File do Unix concatena; ele não ignora o pai. A alegação de caça de que um filho absoluto descarta a raiz está errada no Unix.
StreamRequest não autenticado files//oracle/secretget de mapa files404. files/ e jars/ são buscas por basename, não junções.
receive() / OneWayMessage não autenticadoAbstractAuthRpcHandler.receive401 Unauthenticated call to receive(). x-auth-gated=true.
receiveStream() / UploadStream não autenticadoAbstractAuthRpcHandler.receiveStream401 Unauthenticated call to receiveStream().
receiveStream() autenticado com o segredo do labmesmo gate após doAuthChallenge200 receiveStream-ok. Controle de que o segredo ainda abre o caminho do 9480.

Comprovado em lab vs inferido: leitura de arquivo .. não autenticada, absoluto Unix 404, files/ 404, receive / receiveStream protegidos são de lab. O drain de shuffle do ESS é inferido.

Fechado adjacente (não inflar):

  • Caminho de RCE do CVE-2020-9480: RequestSubmitDriver / RegisterApplication não autenticados via OneWayMessage / UploadStream / RpcRequest. Ainda precisa do segredo compartilhado.
  • Shuffle e submissão de job não autenticados com spark.authenticate=false padrão (FAQ do SECURITY.md, padrão documentado de rede confiável). Não é este remanescente.
  • App A autenticado buscando app B (AppIsolationSuite / SPARK-57889 clientId não nulo).
  • Recuperação de chave de handshake do CVE-2021-38296.
  • CVE-2025-55039 Moderado padrão CTR.
  • O RpcEnv do master standalone normalmente não tem /classes ou artifacts registrados, então esta caminhada de arquivo do host é driver / REPL / Connect, não master:7077.
  • Não executa o arquivo. Não escreve. Não despeja spark.authenticate.secret.

Como eu encontrei

Eu fixei apache/spark v4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8), não master e não um RC 4.3. Vinte e oito caças no código-fonte. Submissão de job em um cluster aberto é por design. Carregamento de modelo ML é código executável. O RCE público do Jackson History, o shell id -Gn da UI, a personificação local do PySpark e o caminho de receive do 9480 estão fechados nesta camada.

Baixar ferramenta