[{"data":1,"prerenderedAt":745},["ShallowReactive",2],{"switcher-blog-pareja":3,"art-php-8-5-9-inyeccion-sql-postgresql-es":6},{"es":4,"en":5},"\u002Fes\u002Fblog\u002Fphp-8-5-9-inyeccion-sql-postgresql\u002F","\u002Fen\u002Fblog\u002Fphp-8-5-9-postgresql-sql-injection\u002F",{"id":7,"title":8,"author":9,"body":10,"date":730,"description":731,"extension":732,"image":733,"meta":734,"navigation":432,"pareja":735,"path":736,"seo":737,"sin_cta":738,"stem":739,"tags":740,"__hash__":744},"blogEs\u002Fes\u002Fblog\u002Fphp-8-5-9-inyeccion-sql-postgresql.md","PHP parchea una inyección SQL en PostgreSQL: CVE-2026-17543 y las cuatro ramas actualizadas de golpe","Paco Cubel",{"type":11,"value":12,"toc":706},"minimark",[13,18,32,45,49,86,89,93,101,111,126,147,154,168,171,178,189,196,200,219,223,233,236,240,296,300,304,326,329,390,394,456,459,463,552,566,570,592,602,606,616,619,623,657,660,664,702],[14,15,17],"h2",{"id":16},"cuatro-ramas-parcheadas-el-mismo-día-eso-ya-dice-algo","Cuatro ramas parcheadas el mismo día: eso ya dice algo",[19,20,21,22,26,27,31],"p",{},"El 30 de julio PHP publicó ",[23,24,25],"strong",{},"8.5.9, 8.4.24, 8.3.33 y 8.2.33",", las cuatro a la vez y las cuatro etiquetadas como ",[28,29,30],"em",{},"security release",". Cuando el equipo de PHP saca la misma tanda simultáneamente en todas las ramas soportadas no es por gusto: es que el fallo está en código compartido y llega hasta la versión más vieja que siguen manteniendo.",[19,33,34,35,40,41,44],{},"Hace tres semanas ya escribimos sobre ",[36,37,39],"a",{"href":38},"\u002Fes\u002Fblog\u002Fphp-8-5-8-parches-seguridad","8.5.8 y 8.4.23",", y aquello era una tanda tranquila. Esta tiene más chicha: hay un ",[23,42,43],{},"CVE de inyección SQL",". Ahora bien, antes de que cunda el pánico, la respuesta honesta a \"¿me toca?\" depende mucho de qué base de datos uses.",[14,46,48],{"id":47},"en-una-frase","En una frase",[19,50,51,52,55,56,63,64,70,71,77,78,81,82,85],{},"Se cierran ",[23,53,54],{},"cinco CVE",": una ",[23,57,58,59],{},"inyección SQL en la extensión ",[60,61,62],"code",{},"pgsql"," (CVE-2026-17543), una ",[23,65,66,67],{},"escritura fuera de límites en ",[60,68,69],{},"bccomp()"," de BCMath (CVE-2026-17544), la ",[23,72,73,74],{},"corrupción de memoria en ",[60,75,76],{},"openssl_encrypt"," que ya conocíamos y que por fin llega a la rama 8.5 (CVE-2026-14355), un ",[23,79,80],{},"crash de Phar con enlaces simbólicos recursivos"," (CVE-2026-7260) y una ",[23,83,84],{},"actualización de libgd"," (CVE-2026-9672). De propina, cuatro fallos de memoria en PDO_ODBC sin CVE asignado.",[19,87,88],{},"Si trabajas con PostgreSQL, deja de leer, actualiza y vuelve. Si vas con MySQL o MariaDB —la mayoría—, el titular no te afecta, pero probablemente sí BCMath.",[14,90,92],{"id":91},"los-fallos-ordenados-por-lo-que-deberías-mirar-primero","Los fallos, ordenados por lo que deberías mirar primero",[94,95,97,98,100],"h3",{"id":96},"_1-inyección-sql-en-pgsql-cve-2026-17543","1. Inyección SQL en ",[60,99,62],{}," (CVE-2026-17543)",[19,102,103,104,110],{},"Es el titular de la tanda. El aviso de seguridad lo describe como una ",[28,105,106,107],{},"inyección SQL por fuga de la barra invertida en cadenas ",[60,108,109],{},"E'...'",".",[19,112,113,114,117,118,121,122,125],{},"La traducción práctica: PostgreSQL tiene un tipo de literal de cadena especial, el que se escribe ",[60,115,116],{},"E'texto'",", en el que ",[23,119,120],{},"la barra invertida se interpreta como carácter de escape"," en lugar de tratarse como un carácter normal. El escapado de PHP no lo estaba teniendo en cuenta correctamente, de modo que una entrada preparada podía ",[23,123,124],{},"salirse de las comillas"," y colar SQL propio en la consulta.",[19,127,128,129,131,132,135,136,139,140,143,144,110],{},"Te toca si tu aplicación habla con PostgreSQL a través de la extensión ",[60,130,62],{}," y construye consultas escapando valores en lugar de usar consultas preparadas con parámetros. Si usas consultas preparadas de verdad —parámetros ",[60,133,134],{},"$1",", ",[60,137,138],{},"$2",", no concatenación disfrazada— el vector se te complica muchísimo, pero ",[23,141,142],{},"actualiza igual",": no vale la pena auditar cada rincón del código para ahorrarte un ",[60,145,146],{},"apt install",[94,148,150,151,153],{"id":149},"_2-escritura-fuera-de-límites-en-bccomp-cve-2026-17544","2. Escritura fuera de límites en ",[60,152,69],{}," (CVE-2026-17544)",[19,155,156,157,160,161,163,164,167],{},"BCMath es la extensión de aritmética de precisión arbitraria, la que se usa para no perder céntimos con los decimales de coma flotante. Es decir: ",[23,158,159],{},"cualquier cosa que maneje dinero en serio"," tiene números pasando por ahí. ",[60,162,69],{}," es la función que compara dos de esos números, y el parche cierra una ",[23,165,166],{},"escritura fuera de límites"," en ella.",[19,169,170],{},"Este es el que afecta a más gente de las tiendas y facturación que gestionamos, y es el motivo por el que esta tanda no es \"opcional\" aunque no toques PostgreSQL.",[94,172,174,175,177],{"id":173},"_3-openssl_encrypt-con-aes-wrap-pad-el-que-arrastrábamos-cve-2026-14355","3. ",[60,176,76],{}," con AES-WRAP-PAD: el que arrastrábamos (CVE-2026-14355)",[19,179,180,181,184,185,188],{},"Este ya lo contamos el 6 de julio, cuando se corrigió en ",[23,182,183],{},"8.4.23",". Lo que no dijimos entonces —porque entonces no se sabía— es que ",[23,186,187],{},"la rama 8.5 se quedó fuera de aquel parche",". Se corrige ahora, en 8.5.9, y ya con número de CVE asignado.",[19,190,191,192,195],{},"Merece la pena quedarse con la lección más que con el fallo: ",[23,193,194],{},"que una rama esté más actualizada no significa que tenga más parches",". Si en julio te fuiste a 8.5.8 pensando que ibas por delante de quien estaba en 8.4.23, en este fallo concreto ibas por detrás. Sigue siendo un modo de cifrado poco habitual (envoltura de claves, no cifrado del día a día), así que la mayoría no lo dispara jamás.",[94,197,199],{"id":198},"_4-phar-con-enlaces-simbólicos-recursivos-cve-2026-7260-y-libgd-cve-2026-9672","4. Phar con enlaces simbólicos recursivos (CVE-2026-7260) y libgd (CVE-2026-9672)",[19,201,202,203,206,207,210,211,214,215,218],{},"Los dos de cierre. El de ",[23,204,205],{},"Phar"," provoca un ",[28,208,209],{},"crash"," mediante enlaces simbólicos recursivos: caída del proceso, no ejecución de código. Te importa si manipulas archivos ",[60,212,213],{},".phar"," o cargas código empaquetado en ese formato. El de ",[23,216,217],{},"libgd"," llega por actualización de la librería que hay debajo de la extensión GD, la que usan medio internet y todos los CMS para redimensionar imágenes subidas por usuarios. Si tu web deja subir fotos, ese código lo estás ejecutando.",[94,220,222],{"id":221},"_5-pdo_odbc-cuatro-fallos-de-memoria-sin-cve","5. PDO_ODBC: cuatro fallos de memoria sin CVE",[19,224,225,226,228,229,232],{},"Sin número de CVE pero con mala pinta: lectura fuera del búfer cuando un valor de columna supera el tamaño que declara el driver, desbordamiento de heap cuando un parámetro de salida es más largo de lo declarado, escritura fuera de límites cuando el driver reporta un mensaje de diagnóstico más largo que el búfer de error, y un ",[28,227,209],{}," con el ",[28,230,231],{},"pooling"," de conexiones cuando el DSN no lleva credenciales.",[19,234,235],{},"En un servidor web típico esto no lo tocas ni de lejos. Si tienes PHP hablando por ODBC contra un SQL Server o un AS\u002F400 heredado, tú sabrás que lo tienes, y estos cuatro son tuyos.",[14,237,239],{"id":238},"a-quién-afecta","A quién afecta",[241,242,243,261,278,290],"ul",{},[244,245,246,249,250,253,254,256,257,260],"li",{},[23,247,248],{},"Prioridad alta",": quien use ",[23,251,252],{},"PostgreSQL"," con la extensión ",[60,255,62],{}," (CVE-2026-17543) y quien mueva dinero por ",[23,258,259],{},"BCMath"," (CVE-2026-17544).",[244,262,263,266,267,270,271,273,274,277],{},[23,264,265],{},"Prioridad media",": quien esté en la ",[23,268,269],{},"rama 8.5"," y use ",[60,272,76],{}," para envolver claves —el parche que la 8.4 tuvo hace tres semanas y la 8.5 no—, y cualquier web que acepte ",[23,275,276],{},"subida de imágenes"," (libgd).",[244,279,280,283,284,286,287,110],{},[23,281,282],{},"Casos concretos",": aplicaciones que manipulan ",[23,285,205],{}," y las que conectan por ",[23,288,289],{},"ODBC",[244,291,292,295],{},[23,293,294],{},"Todos los demás",": no hay un exploit corriendo por internet apuntando a tu servidor esta semana, pero son cuatro ramas parcheadas el mismo día y la actualización es de diez minutos. No hay excusa razonable para dejarlo para septiembre.",[14,297,299],{"id":298},"qué-tienes-que-hacer-hoy","Qué tienes que hacer hoy",[94,301,303],{"id":302},"_1-mira-qué-versión-tienes","1. Mira qué versión tienes",[305,306,311],"pre",{"className":307,"code":308,"language":309,"meta":310,"style":310},"language-bash shiki shiki-themes github-dark-high-contrast","php -v\n","bash","",[60,312,313],{"__ignoreMap":310},[314,315,318,322],"span",{"class":316,"line":317},"line",1,[314,319,321],{"class":320},"s_sBn","php",[314,323,325],{"class":324},"sCcAr"," -v\n",[19,327,328],{},"Los objetivos, según tu rama:",[330,331,332,345],"table",{},[333,334,335],"thead",{},[336,337,338,342],"tr",{},[339,340,341],"th",{},"Rama",[339,343,344],{},"Versión objetivo",[346,347,348,360,370,380],"tbody",{},[336,349,350,354],{},[351,352,353],"td",{},"8.5",[351,355,356,359],{},[23,357,358],{},"8.5.9"," o superior",[336,361,362,365],{},[351,363,364],{},"8.4",[351,366,367,359],{},[23,368,369],{},"8.4.24",[336,371,372,375],{},[351,373,374],{},"8.3",[351,376,377,359],{},[23,378,379],{},"8.3.33",[336,381,382,385],{},[351,383,384],{},"8.2",[351,386,387,359],{},[23,388,389],{},"8.2.33",[94,391,393],{"id":392},"_2-comprueba-si-te-toca-lo-gordo","2. Comprueba si te toca lo gordo",[305,395,397],{"className":307,"code":396,"language":309,"meta":310,"style":310},"# ¿Tengo la extensión de PostgreSQL cargada?\nphp -m | grep -i pgsql\n\n# ¿Y BCMath?\nphp -m | grep -i bcmath\n",[60,398,399,405,427,434,440],{"__ignoreMap":310},[314,400,401],{"class":316,"line":317},[314,402,404],{"class":403},"sQrFR","# ¿Tengo la extensión de PostgreSQL cargada?\n",[314,406,408,410,413,417,420,423],{"class":316,"line":407},2,[314,409,321],{"class":320},[314,411,412],{"class":324}," -m",[314,414,416],{"class":415},"sWyjQ"," |",[314,418,419],{"class":320}," grep",[314,421,422],{"class":324}," -i",[314,424,426],{"class":425},"sTRMh"," pgsql\n",[314,428,430],{"class":316,"line":429},3,[314,431,433],{"emptyLinePlaceholder":432},true,"\n",[314,435,437],{"class":316,"line":436},4,[314,438,439],{"class":403},"# ¿Y BCMath?\n",[314,441,443,445,447,449,451,453],{"class":316,"line":442},5,[314,444,321],{"class":320},[314,446,412],{"class":324},[314,448,416],{"class":415},[314,450,419],{"class":320},[314,452,422],{"class":324},[314,454,455],{"class":425}," bcmath\n",[19,457,458],{},"Si la primera devuelve algo, la inyección SQL es asunto tuyo y esto pasa a ser urgente.",[94,460,462],{"id":461},"_3-actualiza-y-recarga-php-fpm-sin-downtime","3. Actualiza y recarga PHP-FPM (sin downtime)",[305,464,466],{"className":307,"code":465,"language":309,"meta":310,"style":310},"# Debian \u002F Ubuntu (repositorio de Ondřej Surý)\nsudo apt update && sudo apt install --only-upgrade php8.5 php8.5-fpm\nsudo systemctl reload php8.5-fpm\n\n# RHEL \u002F AlmaLinux \u002F Rocky (repositorio Remi)\nsudo dnf update php php-fpm\nsudo systemctl reload php-fpm\n",[60,467,468,473,504,516,520,525,541],{"__ignoreMap":310},[314,469,470],{"class":316,"line":317},[314,471,472],{"class":403},"# Debian \u002F Ubuntu (repositorio de Ondřej Surý)\n",[314,474,475,478,481,484,488,490,492,495,498,501],{"class":316,"line":407},[314,476,477],{"class":320},"sudo",[314,479,480],{"class":425}," apt",[314,482,483],{"class":425}," update",[314,485,487],{"class":486},"sMAXC"," && ",[314,489,477],{"class":320},[314,491,480],{"class":425},[314,493,494],{"class":425}," install",[314,496,497],{"class":324}," --only-upgrade",[314,499,500],{"class":425}," php8.5",[314,502,503],{"class":425}," php8.5-fpm\n",[314,505,506,508,511,514],{"class":316,"line":429},[314,507,477],{"class":320},[314,509,510],{"class":425}," systemctl",[314,512,513],{"class":425}," reload",[314,515,503],{"class":425},[314,517,518],{"class":316,"line":436},[314,519,433],{"emptyLinePlaceholder":432},[314,521,522],{"class":316,"line":442},[314,523,524],{"class":403},"# RHEL \u002F AlmaLinux \u002F Rocky (repositorio Remi)\n",[314,526,528,530,533,535,538],{"class":316,"line":527},6,[314,529,477],{"class":320},[314,531,532],{"class":425}," dnf",[314,534,483],{"class":425},[314,536,537],{"class":425}," php",[314,539,540],{"class":425}," php-fpm\n",[314,542,544,546,548,550],{"class":316,"line":543},7,[314,545,477],{"class":320},[314,547,510],{"class":425},[314,549,513],{"class":425},[314,551,540],{"class":425},[19,553,554,555,558,559,135,562,565],{},"El ",[60,556,557],{},"reload"," de PHP-FPM aplica el binario nuevo sin cortar las peticiones en curso. Ajusta el número de versión (",[60,560,561],{},"php8.5",[60,563,564],{},"php8.4","…) al que tengas instalado.",[94,567,569],{"id":568},"_4-confirma-que-quedó-aplicado","4. Confirma que quedó aplicado",[305,571,573],{"className":307,"code":572,"language":309,"meta":310,"style":310},"php -v\nphp-fpm8.5 -v   # o php-fpm -v según tu distro\n",[60,574,575,581],{"__ignoreMap":310},[314,576,577,579],{"class":316,"line":317},[314,578,321],{"class":320},[314,580,325],{"class":324},[314,582,583,586,589],{"class":316,"line":407},[314,584,585],{"class":320},"php-fpm8.5",[314,587,588],{"class":324}," -v",[314,590,591],{"class":403},"   # o php-fpm -v según tu distro\n",[593,594,595],"blockquote",{},[19,596,597,598,601],{},"Como siempre con las distribuciones: a veces backportean el fix manteniendo un número de versión distinto. ",[23,599,600],{},"No te fíes solo del número, mira la fecha del paquete"," o el changelog de seguridad de tu distro. \"Está actualizado\" se comprueba, no se recuerda.",[14,603,605],{"id":604},"lo-que-hacemos-nosotros","Lo que hacemos nosotros",[19,607,608,609,612,613,615],{},"Cuando sale una tanda así, lo primero no es actualizar a lo bruto: es ",[23,610,611],{},"cruzar el fallo con lo que hay montado",". Sacamos qué servidores tienen ",[60,614,62],{}," cargada, cuáles exponen la aplicación de cara a internet y cuáles tienen facturación pasando por BCMath, y esos van primero, hoy. El resto entra en la ronda normal de actualizaciones de la semana.",[19,617,618],{},"Esa lista —qué extensión tiene cada servidor, qué versión corre, cuándo se parcheó por última vez— es la que convierte una tanda de cinco CVE en un trámite de diez minutos en lugar de una tarde de sustos. Tenerla al día vale más que correr detrás de cada punto de versión.",[14,620,622],{"id":621},"la-rutina-de-siempre","La rutina de siempre",[241,624,625,631,637,647,652],{},[244,626,627,630],{},[60,628,629],{},"php -v"," para saber dónde estás.",[244,632,633,636],{},[60,634,635],{},"php -m"," para saber qué extensiones cargas de verdad.",[244,638,639,642,643,646],{},[60,640,641],{},"apt","\u002F",[60,644,645],{},"dnf update"," de PHP y PHP-FPM.",[244,648,649,110],{},[60,650,651],{},"systemctl reload php*-fpm",[244,653,654,656],{},[60,655,629],{}," otra vez para confirmar.",[19,658,659],{},"Si tu PHP lleva meses sin ver un parche, o no tienes claro qué extensiones carga cada servidor que gestionas, es buen momento para revisarlo. Y si prefieres que lo llevemos nosotros, hablamos.",[14,661,663],{"id":662},"referencias","Referencias",[241,665,666,674,681,688,695],{},[244,667,668],{},[36,669,673],{"href":670,"rel":671},"https:\u002F\u002Fwww.php.net\u002FChangeLog-8.php",[672],"nofollow","PHP.net — ChangeLog de la rama 8",[244,675,676],{},[36,677,680],{"href":678,"rel":679},"https:\u002F\u002Fwww.php.net\u002Fdownloads.php",[672],"PHP.net — Descargas",[244,682,683],{},[36,684,687],{"href":685,"rel":686},"https:\u002F\u002Fgithub.com\u002Fphp\u002Fphp-src\u002Fsecurity\u002Fadvisories\u002FGHSA-7qpv-r5mr-78m4",[672],"GHSA-7qpv-r5mr-78m4 — Inyección SQL en pgsql",[244,689,690],{},[36,691,694],{"href":692,"rel":693},"https:\u002F\u002Fgithub.com\u002Fphp\u002Fphp-src\u002Fsecurity\u002Fadvisories\u002FGHSA-x692-q9x7-8c3f",[672],"GHSA-x692-q9x7-8c3f — Escritura fuera de límites en bccomp()",[244,696,697],{},[36,698,701],{"href":699,"rel":700},"https:\u002F\u002Fgithub.com\u002Fphp\u002Fphp-src\u002Fsecurity\u002Fadvisories\u002FGHSA-vc5h-9ppw-p5f3",[672],"GHSA-vc5h-9ppw-p5f3 — Crash de Phar con enlaces simbólicos recursivos",[703,704,705],"style",{},"html pre.shiki code .s_sBn, html code.shiki .s_sBn{--shiki-default:#FFB757}html pre.shiki code .sCcAr, html code.shiki .sCcAr{--shiki-default:#91CBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sQrFR, html code.shiki .sQrFR{--shiki-default:#BDC4CC}html pre.shiki code .sWyjQ, html code.shiki .sWyjQ{--shiki-default:#FF9492}html pre.shiki code .sTRMh, html code.shiki .sTRMh{--shiki-default:#ADDCFF}html pre.shiki code .sMAXC, html code.shiki .sMAXC{--shiki-default:#F0F3F6}",{"title":310,"searchDepth":407,"depth":407,"links":707},[708,709,710,720,721,727,728,729],{"id":16,"depth":407,"text":17},{"id":47,"depth":407,"text":48},{"id":91,"depth":407,"text":92,"children":711},[712,714,716,718,719],{"id":96,"depth":429,"text":713},"1. Inyección SQL en pgsql (CVE-2026-17543)",{"id":149,"depth":429,"text":715},"2. Escritura fuera de límites en bccomp() (CVE-2026-17544)",{"id":173,"depth":429,"text":717},"3. openssl_encrypt con AES-WRAP-PAD: el que arrastrábamos (CVE-2026-14355)",{"id":198,"depth":429,"text":199},{"id":221,"depth":429,"text":222},{"id":238,"depth":407,"text":239},{"id":298,"depth":407,"text":299,"children":722},[723,724,725,726],{"id":302,"depth":429,"text":303},{"id":392,"depth":429,"text":393},{"id":461,"depth":429,"text":462},{"id":568,"depth":429,"text":569},{"id":604,"depth":407,"text":605},{"id":621,"depth":407,"text":622},{"id":662,"depth":407,"text":663},"2026-07-31","PHP publica 8.5.9, 8.4.24, 8.3.33 y 8.2.33 el mismo día. Hay una inyección SQL en la extensión pgsql, una escritura fuera de límites en bccomp() y, por fin, el parche de openssl_encrypt para la rama 8.5. Te contamos cuál te toca según lo que tengas montado.","md","\u002Fog\u002Fog-default.png",{},"php-8-5-9-postgresql-sql-injection","\u002Fes\u002Fblog\u002Fphp-8-5-9-inyeccion-sql-postgresql",{"title":8,"description":731},false,"es\u002Fblog\u002Fphp-8-5-9-inyeccion-sql-postgresql",[741,742,743],"PHP","Seguridad","Servidores","72lnPhbJEmdo4yomYoXCbe3OIIj41QhOe4ZkpBTkrLc",1787312492449]