CID 1686762 src/sample.c out of bound access suspected by coverity
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 1/5
- Tempo estimado
- Menos de uma hora
- Facilidade para iniciantes
- 82/100
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
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
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de haproxy/haproxy
-
type: feature
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 77/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
-
type: code-report
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
-
type: feature
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 75/100
Todas as issues de haproxy/haproxy
Issues semelhantes
-
UB: (int) cast of a user double outside int range in dispatch / vm_index_is_int / flat_index_atAbertaarea:runtime-vm
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
InauguralSystems/EigenScript#1748 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
Mantenedores costumam responder em até 4 dias
-
Dificuldade 2/5 Meio dia Facilidade para iniciantes 62/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
Mantenedores costumam responder em até 1 dia
-
foomatic-rip: dstrtrim_right() underflows mid-loop on an all-whitespace stringTalvez já em andamento @ManasBagul23 assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
OpenPrinting/cups-filters#759 ·
Mantenedores costumam responder em até 11 dias