El mantenedor de libexpat, la librería en C que parsea XML dentro de Python, Perl, PHP y miles de proyectos más, pasó diez años sosteniendo el proyecto en su tiempo libre. Eso cambió el 1 de agosto de 2026: la Ciudad de Múnich empezó a pagarle un contrato de hasta seis meses para que se dedique a libexpat como su trabajo principal.
El anuncio lo hizo Sebastian Pipping, mantenedor del proyecto desde hace más de una década, en su blog personal. El financiamiento llega a través del programa Open Source Sabbatical de digitial@M, la iniciativa digital de la ciudad, y marca el fin de lo que Pipping llamó su vacación de seguridad: un período en el que dejó de atender reportes de vulnerabilidades por agotamiento.
TL;DR
- El 1 de agosto de 2026 la Ciudad de Múnich empezó a financiar el mantenimiento de libexpat por hasta 6 meses.- El programa se llama Open Source Sabbatical y opera bajo digitial@M, la iniciativa digital municipal.- Sebastian Pipping, mantenedor desde hace más de 10 años, pasa a trabajar en libexpat como su ocupación principal.- La prioridad número uno son las 5 vulnerabilidades conocidas y sin parchear que arrastra el proyecto.- El segundo objetivo es sumar soporte para XML 1.0, quinta edición (XML 1.0r5).- El tercer objetivo es mejorar la robustez y mantenibilidad general del código.- Los dos días previos al anuncio, Pipping los pasó arreglando una vulnerabilidad reportada por Mozilla.- El contrato es remoto y de trabajo regular, con cláusulas de cancelación para ambas partes.
Qué pasó
Sebastian Pipping publicó el 4 de agosto de 2026 en su blog personal que, a partir del 1 de agosto, dejó de mantener libexpat como pasatiempo y empezó a hacerlo bajo un contrato de trabajo regular. El financiamiento proviene de la Ciudad de Múnich, a través de digitial@M, el brazo de transformación digital del gobierno municipal, bajo su programa Open Source Sabbatical.
El contrato cubre hasta seis meses de trabajo dedicado y remoto, con posibilidad de cancelación por cualquiera de las dos partes. Pipping fue explícito sobre sus prioridades para ese período: cerrar las cinco vulnerabilidades conocidas que hoy están sin parchear, incorporar soporte para XML 1.0 quinta edición y reforzar la robustez general del parser.
El anuncio llega justo después de que Pipping dedicara los dos días previos a corregir una vulnerabilidad reportada por Mozilla, uno de los consumidores más visibles de Expat: Firefox usa el parser para procesar XML y XHTML dentro del navegador.
Contexto e historia
Expat es un parser de XML de tipo streaming: en vez de cargar el documento completo en memoria y devolver un árbol, lee el XML por partes y dispara callbacks cada vez que encuentra una etiqueta de apertura, una de cierre o un bloque de texto. Ese modelo, conocido como SAX, lo hace liviano y apto para archivos grandes o entornos con memoria limitada, como sistemas embebidos.
Escrita en C99, multiplataforma y bajo licencia MIT, libexpat es, junto con libxml2, una de las dos implementaciones libres de parsers XML en C más usadas del mundo. Python la trae integrada en su módulo estándar xml.parsers.expat, y también aparece dentro de Perl, PHP, Mono y decenas de proyectos de infraestructura de bajo nivel que necesitan parsear XML sin arrastrar una dependencia pesada.
Durante buena parte de la última década, mantener ese código quedó en manos de un solo desarrollador que lo hacía fuera de su horario laboral. Pipping lo resume así: mantener libexpat competía con su trabajo de tiempo completo como ingeniero de software, las tareas domésticas, la vida social y el descanso. El resultado, según describe, fue lo que llama una vacación de seguridad: reportes de vulnerabilidades que se acumulaban sin nadie dedicado a triagearlos a tiempo.
📌 Nota: Antes de este acuerdo, Pipping ya había advertido públicamente que dejaría de atender reportes de seguridad de libexpat por agotamiento; el contrato con Múnich revierte esa pausa, al menos por los próximos seis meses.
Expat procesa XML como stream SAX, sin cargar el documento completo en memoria.Detalles técnicos y rendimiento
La lista de prioridades que fijó Pipping para estos seis meses tiene un orden claro. Primero, cerrar las cinco vulnerabilidades conocidas y sin parchear que hoy arrastra el proyecto: no dio números de CVE en el anuncio, pero confirmó que ya destinó los dos días previos a resolver una reportada por el equipo de Mozilla.
Segundo, sumar soporte para XML 1.0, quinta edición (conocida como XML 1.0r5), la revisión más reciente de la especificación del W3C, que ajusta reglas de caracteres válidos en nombres y contenido respecto a ediciones anteriores. Tercero, mejorar la robustez y mantenibilidad general del código: refactors, cobertura de tests y limpieza de deuda técnica que un mantenedor part-time difícilmente puede priorizar frente a los reportes urgentes.
Pipping también dejó una advertencia para quien quiera colaborar: los reportes de vulnerabilidades generados con IA sin validación previa seguirán sin ser bienvenidos. Pidió específicamente que quien encuentre fallos reales en libexpat se los envíe ahora, mientras tiene tiempo dedicado para atenderlos, aunque aclaró que la teoría de colas y las leyes de la física siguen aplicando: incluso con financiamiento, el tiempo de respuesta tiene límites físicos.
libexpat frente a libxml2: cuándo usar cada una
OpciónCuándo usarlaVentajaLimitaciónlibexpatParsear XML grande o en streaming, sin necesidad de XPath o XSLTLiviana, API SAX simple, huella de memoria mínimaNo arma un árbol DOM ni soporta XPathlibxml2Necesitás DOM, XPath, XSLT o validación con esquemasFeature-complete: DOM, SAX, XPath, XSLT, RelaxNGBinario más pesado y mayor superficie de ataque
Cómo empezar o probarlo
libexpat se instala como paquete de sistema en Linux y macOS, o vía vcpkg en Windows. La API se usa directo desde C o C++, aunque casi ningún desarrollador la toca a mano: Python, Perl y PHP ya la traen embebida en sus intérpretes.
Instalación
# Linux (Debian/Ubuntu)
sudo apt install libexpat1-dev
# macOS (Homebrew)
brew install expat
# Windows (vcpkg)
vcpkg install expat
En muchas distribuciones Linux el paquete libexpat1 (sin el -dev) ya viene preinstalado, porque componentes del sistema como systemd y dbus dependen de él para procesar XML interno.
Un parser mínimo en C
#include
#include
#include
static void start_element(void *userData, const char *name, const char **attrs) {
printf("\n", name);
}
int main() {
XML_Parser parser = XML_ParserCreate(NULL);
XML_SetElementHandler(parser, start_element, NULL);
const char *xml = "Hola";
XML_Parse(parser, xml, strlen(xml), 1);
XML_ParserFree(parser);
return 0;
}
Este programa registra un callback que se dispara en cada etiqueta de apertura y lo compila directo contra libexpat. Al correrlo imprime <canal> y <item> en orden, sin haber construido nunca un árbol DOM en memoria.
Compilar y verificar la versión instalada
# Linux/macOS
gcc parser.c -lexpat -o parser
./parser
# Confirmar la version de libexpat instalada
xmlwf -v
El comando xmlwf -v, el verificador de buena formación que se instala junto con libexpat, imprime la versión exacta de la librería contra la que fue compilado. También se puede consultar en runtime desde código propio con XML_ExpatVersion(), que devuelve un string del tipo expat_2.6.0.
💡 Tip: si tu proyecto usa Python, no necesitás instalar nada aparte:
import xml.parsers.expatya trae libexpat embebida en el intérprete estándar.
El contrato con digitial@M permite cancelación por cualquiera de las dos partes.Impacto y análisis
El caso de libexpat expone un problema conocido en el software libre: proyectos que sostienen infraestructura crítica, como Python, Firefox, dbus o systemd, que dependen directa o indirectamente de Expat, quedan a merced del tiempo libre de una sola persona. Iniciativas como el Open Source Sabbatical de Múnich apuntan a esa brecha: pagar directamente a mantenedores individuales en vez de financiar solo herramientas nuevas.
Que sea una administración pública la que financie el mantenimiento, y no una fundación de software o una empresa privada, también es una señal. Los gobiernos que dependen de código abierto en su propia infraestructura empiezan a tratar el mantenimiento de esas dependencias como un gasto de continuidad operativa, no como una donación de caridad puntual.
El diagrama siguiente resume la cadena que hizo posible este contrato:
flowchart TD
A["Ciudad de Munich"] --> B["Programa Open Source Sabbatical"]
B --> C["digitial@M"]
C --> D["Contrato con Sebastian Pipping"]
D --> E["Mantenimiento de libexpat"]
Qué sigue
Pipping fijó un orden de prioridades pero no publicó un calendario de releases. En base a lo que describió en su blog, lo esperable en los próximos meses es una seguidilla de versiones menores de libexpat que vayan cerrando las cinco vulnerabilidades pendientes, seguidas de una versión que sume soporte a XML 1.0r5.
También dejó una invitación abierta: cualquiera que quiera reportar vulnerabilidades reales, no generadas por IA sin validar, tiene ahora la mejor ventana de los últimos años para que se les dé seguimiento en un tiempo razonable, mientras dure el contrato con Múnich.
Por separado, Pipping pidió ayuda técnica sobre un problema no relacionado: lograr que Clang-based MinGW corra junto con AddressSanitizer y Wine sin que el binario falle al iniciar. Lo dejó como pedido abierto a la comunidad al cierre de su publicación.
📖 Resumen en Telegram: Ver resumen
Probalo vos: instalá libexpat1-dev en Linux o expat vía Homebrew en macOS y compilá el parser mínimo de arriba para ver el streaming SAX funcionando en menos de un minuto.
Preguntas frecuentes
¿Qué es libexpat?
Es una librería de C99, multiplataforma y bajo licencia MIT, que parsea documentos XML con un modelo de streaming (SAX): lee el documento por partes y dispara callbacks en vez de construir un árbol completo en memoria.
¿Quién paga el contrato de Sebastian Pipping?
La Ciudad de Múnich, a través de digitial@M, su iniciativa de transformación digital, bajo el programa Open Source Sabbatical.
¿Cuánto dura el financiamiento?
Hasta seis meses, con un contrato de trabajo regular y remoto que incluye cláusulas de cancelación para ambas partes.
¿Qué prioridades fijó Pipping para ese período?
Tres, en orden: cerrar las cinco vulnerabilidades conocidas y sin parchear, sumar soporte para XML 1.0 quinta edición (XML 1.0r5), y mejorar la robustez y mantenibilidad general del proyecto.
¿libexpat es lo mismo que libxml2?
No. Ambas son parsers de XML libres escritos en C, pero libxml2 suma DOM, XPath y XSLT, mientras que libexpat se mantiene deliberadamente liviana con un modelo SAX puro.
¿Cómo se reporta una vulnerabilidad en libexpat?
Pipping pidió enviarlas directamente por los canales de contacto que detalla en su blog personal, aclarando que los reportes generados con IA sin validación previa no son bienvenidos.
Referencias
- Hartwork Blog: el anuncio original de Sebastian Pipping sobre el financiamiento de la Ciudad de Múnich.- Repositorio de libexpat en GitHub: código fuente, issues y releases del proyecto.- Expat (library) en Wikipedia: historia y contexto general del parser.
📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.
Top comments (0)