Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

CID 1686762 src/sample.c out of bound access suspected by coverity

Aberta Para iniciantes
#3,510 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
1/5
Tempo estimado
Menos de uma hora
Facilidade para iniciantes
82/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
c
Domínio
backend, security

Direção de pesquisa

O defeito está em sample_conv_jwt_member_query em src/sample.c por volta das linhas 5038-5080: a guarda só captura ret == -1, então o outro retorno negativo de base64urldec (-2, "output buffer too small") passa e é passado para memchr como unsigned length. Leia o contrato de base64urldec (seus códigos de retorno) e amplie a verificação para que qualquer ret negativo vá para end antes que decoded_header->area seja usado. Pronto parece uma compilação limpa mais uma chamada de conversor JWT em um token cujo membro decodifica em um buffer muito pequeno ainda falhando graciosamente em vez de ler fora dos limites.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

type: code-report
Tool Name and Version

coverity

Code Report
5038static int sample_conv_jwt_member_query(const struct arg *args, struct sample *smp,
5039                                        void *private, enum jwt_elt member)
5040{
5041        struct jwt_item items[JWT_ELT_MAX] = { { 0 } };
5042        unsigned int item_num = member + 1; /* We don't need to tokenize the full token */
5043        struct buffer *decoded_header;
5044        int retval = 0;
5045        int ret;
5046
5047        /* We don't need to extract all the parts from the token, we only need a
5048         * specific one.
5049         */
      	1. Condition jwt_tokenize(&smp->data.u.str, items, item_num) < 0, taking false branch.
5050        if (jwt_tokenize(&smp->data.u.str, items, item_num) < 0)
5051                goto end;
5052
5053        decoded_header = get_trash_chunk_sz(items[member].length);
      	2. Condition !decoded_header, taking false branch.
5054        if (!decoded_header)
5055                goto end;
5056
      	3. return_constant: Function call base64urldec(items[member].start, items[member].length, decoded_header->area, decoded_header->size) may return -2.
      	4. assignment: Assigning: ret = base64urldec(items[member].start, items[member].length, decoded_header->area, decoded_header->size). The value of ret is now -2.
5057        ret = base64urldec(items[member].start, items[member].length,
5058                           decoded_header->area, decoded_header->size);
      	5. Condition ret == -1, taking false branch.
5059        if (ret == -1)
5060                goto end;
5061
5062        /* mjson might return an embedded \0 that is not valid as a string */
      	
CID 1686762: (#1 of 1): Out-of-bounds access (OVERRUN)
6. overrun-buffer-arg: Calling memchr with decoded_header->area and ret is suspicious because of the very large index, 18446744073709551614. The index may be due to a negative parameter being interpreted as unsigned.
5063        if (memchr(decoded_header->area, 0, ret))
5064                goto end;
5065
5066        decoded_header->data = ret;
5067        if (args[0].type != ARGT_STR) {
5068                smp->data.u.str = *decoded_header;
5069                smp->data.type = SMP_T_STR;
5070                goto end;
5071        }
5072
5073        /* We look for a specific field of the header or payload part of the JWT */
5074        smp->data.u.str = *decoded_header;
5075
5076        retval = sample_conv_json_query(args, smp, private);
5077
5078end:
5079        return retval;
5080}
Additional Information

No response

Output of haproxy -vv
n/a
Linguagem predominante
C
Estrelas
6.9k
Forks
976
Métricas de merge de PRs
Nenhum PR com merge em 30d

Preparar o ambiente

Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de haproxy/haproxy

Todas as issues de haproxy/haproxy

Issues semelhantes

Mais issues de C

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.