[BUG] system/vncviewer: `rfb_negotiate_security` never bounds the server-supplied security-type count against `sizeof(types)`, overflowing the 16-byte stack array `types[16]` (pre-auth stack buffer overflow)
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 76/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- c
- Área
- networking
Línea de trabajo
Empieza por system/vncviewer/rfb_protocol.c, especialmente por rfb_negotiate_security() y rfb_recv_exact(), para seguir cómo se usa la cantidad proporcionada por el servidor como longitud de lectura. Comprueba cómo rfb_discard_exact() maneja los bytes sobrantes. Rechaza una cantidad demasiado grande o consúmela de forma segura sin escribir más allá de types[16]; el trabajo estará terminado cuando las cantidades demasiado grandes no puedan desbordar el búfer y los handshakes válidos sigan funcionando.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Description / Steps to reproduce the issue
During the RFB 3.7+ security handshake the server sends a one-byte count of security types,
followed by that many type bytes. rfb_negotiate_security() reads the count straight off the
socket into a uint8_t and uses it as the length of a recv into the fixed 16-byte stack array
types[16], with no upper-bound check (only the == 0 case is special-cased).
system/vncviewer/rfb_protocol.c, rfb_negotiate_security():
521 static int rfb_negotiate_security(int sockfd, const char *password)
522 {
523 uint8_t num_types;
524 uint8_t types[16]; /* 16-byte stack buffer */
...
532 ret = rfb_recv_exact(sockfd, &num_types, 1); /* server-supplied 1..255 */
...
538 if (num_types == 0) { ... return -ECONNREFUSED; } /* ONLY the ==0 case handled */
...
551 ret = rfb_recv_exact(sockfd, types, num_types); /* SINK: writes num_types bytes */
rfb_recv_exact() writes exactly len bytes into the caller buffer:
383 static int rfb_recv_exact(int sockfd, void *buf, size_t len)
...
388 while (len > 0)
390 n = recv(sockfd, p, len, 0);
406 p += n;
407 len -= n;
So line 551 can recv up to 255 bytes into types[16], a 239-byte stack overflow of
attacker-chosen content that smashes the saved-register / return-address region of the frame.
There is no bound at all (not even a DEBUGASSERT) between the 1-byte read of num_types and
its use as the copy length.
This runs before authentication: vncviewer_main.c:191 rfb_connect() →
vncviewer_main.c:208 rfb_handshake() → rfb_protocol.c:772 rfb_negotiate_security(). A
malicious VNC server (the server a viewer connects to) or an on-path attacker injecting into the
TCP stream triggers it on the first handshake, with no credentials.
Steps:
- Build and run the vncviewer app and connect to an attacker-controlled / MITM'd VNC server.
- In the RFB 3.7+ security handshake, have the server send a security-type count of e.g.
0xff
followed by that many bytes. rfb_negotiate_security()writes those bytes pasttypes[16].
An AddressSanitizer build reports a stack-buffer-overflow WRITE past the 16-byte types array.
Expected: a count larger than the viewer's buffer is rejected or read in capped chunks.
Actual: up to 255 attacker bytes are written past types[16] on the stack, before auth.
Suggested fix: reject or clamp num_types to sizeof(types) before the recv — the viewer
only needs to know whether None / VNC Auth is offered, so it can read in capped chunks and
discard the remainder like rfb_discard_exact already does elsewhere.
On which OS does this issue occur?
[OS: Linux]
What is the version of your OS?
ubuntu 22
NuttX Version
a09fb84a9b5f274add52cc0b6d803b77d44306c1
Issue Architecture
[Arch: all]
Issue Area
[Area: Networking]
Host information
No response
Verification
- I have verified before submitting the report.
- Lenguaje dominante
- C
- Estrellas
- 472
- Forks
- 793
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 116
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Sin guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de apache/nuttx-apps
-
[FEATURE] Shrink getprime runs for OSTestPosiblemente ocupada @linguini1 la tomó hace 19 días. AbiertoType: Enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
apache/nuttx-apps#3620 · 6 comentarios · 1 reacción · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Type: Enhancement
Dificultad 4/5 3-5 días Aptitud para principiantes 18/100
apache/nuttx-apps#3816 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
[FEATURE] `pthread_sigqueue` testing implementationPosiblemente ocupada @Swatantra-66 la tomó hace 3 días. AbiertoType: Enhancement
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
apache/nuttx-apps#3796 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
[BUG] testing/sched/timerjitter: unexpected results under normal usagePosiblemente ocupada @RogerNext la tomó hace 93 días. AbiertoType: Bug
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
apache/nuttx-apps#3634 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
[TODO] move graphics/input -> input.Quizá libre de nuevo @cederom la tomó hace 219 días y no hay ningún pull request abierto. Abierto
apache/nuttx-apps#3436 · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de apache/nuttx-apps
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
ly05010419/MacNativeGames#1420 ·
Los mantenedores suelen responder en 1 día
-
GPU-UNLOCK RTX 4070 (2786) Gigabyte 1458:416C: cold boot AND warm reboot unlock, Ubuntu 26.04Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
JustAResearcher/gpu-unlock-ada#124 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
swoole/swoole-cli#1092 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
-
inflate: total_in uses plain += on c_ulong (32-bit on Windows), panics in debug for streams > 4 GiBAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
trifectatechfoundation/zlib-rs#570 · 1 comentario ·