Recientemente, nuestro sistema de detección de vulnerabilidades descubrió un problema crítico en el rBPF de Solana (es decir, la máquina virtual donde se ejecutan todas las dApps de Solana: https://github.com/solana-labs/rbpf). Tras una investigación exhaustiva, descubrimos que se trata de un error de desbordamiento de enteros que puede explotarse para colapsar toda la red de Solana. Reportamos el error al equipo de seguridad de Solana, y el equipo actuó de inmediato para confirmar y corregir el fallo. Al momento de escribir esto, casi todos los nodos validadores recibieron el parche y se actualizaron a la última versión, lo que significa que es seguro hacer una divulgación pública.
eBPF y rBPF
Extended Berkeley Packet Filter (eBPF[1]) fue desarrollado inicialmente para el filtrado de paquetes en el kernel. Debido a la seguridad, eficiencia y escalabilidad de eBPF, actualmente se utiliza en diversas áreas como redes, rastreo, perfilado, etc[2]. Considerando la amplia capacidad de eBPF, Solana lo eligió también como motor de ejecución para los contratos inteligentes. Para desarrollar dApps en Solana, los desarrolladores deben crear sus contratos inteligentes en Rust, que serán compilados en bytecode eBPF.
Para alojar las dApps de Solana, se requiere una máquina virtual precisa para eBPF. En este caso, Solana utiliza rBPF, que es una máquina virtual para eBPF escrita en Rust. Sin embargo, se desconoce si la máquina virtual propuesta (es decir, rBPF) es robusta, segura y precisa. Si existen problemas de seguridad dentro de rBPF, todos los validadores que contengan rBPF pueden verse afectados, ocasionando grandes pérdidas (p. ej., ataques DDoS) para toda la red de Solana.
La causa raíz del error
Hemos desarrollado una herramienta para localizar errores en rBPF. Esta herramienta aún se encuentra en desarrollo activo. Durante este proceso, se identificó un problema grave en rBPF (versión 0.2.16) que puede derribar toda la red.
Específicamente, la función "load" en el archivo "elf.rs" se utiliza para analizar y verificar el archivo ELF (el contrato inteligente). Primero, la función "load" lee la estructura ELF e invoca la función "relocate" para configurar el desplazamiento del destinatario. Sin embargo, en la función "relocate", el atributo "sym.st_value" se recupera directamente del archivo ELF. Si el valor "st_value" es suficientemente grande, se puede desencadenar un desbordamiento de enteros al calcular "addr", que es la suma de "sym.st_value" y "refd_pa".

En este caso, un atacante puede crear un archivo ELF malicioso como contrato inteligente, lo que puede provocar el desbordamiento de enteros. Después de eso, cada validador ejecutaría el archivo ELF objetivo y rBPF entraría en pánico con "add with overflow".

En ese momento, rBPF quedará bloqueado y las transacciones entrantes no se ejecutarán, lo que resultará en un ataque DoS. Podemos observar que el nodo queda atascado en "Finalizing transaction", como se muestra a continuación, debido al desbordamiento de enteros al cargar el archivo ELF.

Este problema fue introducido en https://github.com/solana-labs/rbpf/pull/200, lo que significa que rBPF es vulnerable desde la versión 0.2.14. Identificamos el problema y lo reportamos al equipo de seguridad de Solana el 6 de diciembre de 2021. Solana solucionó el problema en pocas horas mediante el mecanismo de matemática segura tras nuestro reporte. La corrección está en https://github.com/solana-labs/rbpf/pull/236. Al momento de escribir esto (2021/12/30), más del 86% de los validadores se han actualizado a la versión más reciente.
[1] https://en.wikipedia.org/wiki/Berkeley_Packet_Filter
[2] https://ebpf.io/
Cronología
- 2021/12/06: el problema fue reportado al equipo de seguridad de Solana
- 2021/12/06: la vulnerabilidad fue corregida.
- 2021/12/30: la información sobre esta vulnerabilidad fue publicada
- 2022/01/28: se asignó el CVE-2021–46102



