Hace 10 años | Por kampanita a genbeta.com
Publicado hace 10 años por kampanita a genbeta.com

El viernes pasado, Apple lanzaba una actualización urgente para iOS 7. La razón: una vulnerabilidad en el sistema SSL/TLS. Y no una vulnerabilidad cualquiera, sino un fallo muy grave. La librería de Apple no verificaba correctamente la autenticidad de la conexión, de tal forma que alguien podría escuchar sin problemas conexiones aparentemente seguras. La misma vulnerabilidad se ha descubierto también en OS X, y además se ha detectado una enorme coincidencia sobre las fechas en las que ese fallo apareció.

Comentarios

D

#3 1984 es ahora.

D

#4 Muy bueno

pys

#5 Lectura ligera para antes de acostarse

Or3

#3 Pues para jugar al MSX era de lo más común durante todos los 80.

Xtampa2

#25 Hombre, para jugar precisamente no creo que fuera común, lo sería para programar en el Basic que traían la máquinas en ROM. Para jugar valía con LOAD, BLOAD o CLOAD, dependiendo de lo que quisieras cargar de la cinta. O enchufar un cartucho de Konami y te olvidabas de todo eso

Or3

#44 Nosotros es que éramos piratillas ya por aquellos días y para localizar el juego entre los varios que cabían en
la cinta de cassette hacía falta el "goto".

Xtampa2

#50 ¿Me puedes explicar cómo lo hacías si lo recuerdas? Yo para hacer eso directamente apuntaba el contador de vueltas del cassette. Y el único control que se tenía sobre él desde el ordenador era encenderlo y apagarlo, no avanzarlo rápidamente.

Or3

#61 Nosotros no teníamos nada tan refinado como contar las vueltas. No lo recuerdo exactamente porque fue hace más de veinte años pero creo recordar que ponías la cinta y el ordenador encontraba los juegos. Según los encontraba decidías si jugar o no. Eso si no estaba el dueño del MSX.

Mi primo era el que lo controlaba y recuerdo que usaba el "goto" para dejar pasar los juegos hasta encontrar el que buscaba. Mientras merendábamos y tal.

Xtampa2

#62 Joer, en una cinta de 45 mins por cara ya podíais merendar bien si el juego estaba al final lol

Or3

#63 Era un soberano coñazo. Lo de merendar era porque la mayoría de las veces los juegos no cargaban bien o directamente no cargaban. Así que daba igual saber la vuelta en la que estaba el juego, los 15 min de espera no te los quitaba nadie.

Xtampa2

#64 Joer, yo cuando grababa un juego o me llegaba una cinta de intercambio lo primero que hacía era "medirla" con el cuenta vueltas y apuntar donde comenzaba cada juego. Luego para cargar no había más que poner el contador a cero y darle al FF hasta que llegara al punto que llegara. Eran unos segundos y luego ya le podía darle a cargar.

outofmemory

#25 Teníamos el ON ERROR GOTO xxx, que curiosamente es similar al mecanismo del código que comentamos con los gotos, pero con algo muy similar al control de excepciones. Si es que el MSX es muy grande...

RubenC

#3 ¿Y qué te piensas que es el ensamblador? "gotos" a punta pala. Que en los lenguajes de alto nivel (y no tan alto) puedas prescindir de él, vale. Pero cuando bajas del todo, es lo que queda, inevitablemente.

KimDeal

#3 a mi me amenazaban con el hambre, la miseria y el ostracismo en el mundo informático si ponía un solo goto... y ya ves, no había para tanto

D

#6 Más bien esta comentando como lo han relacionado otros, el no apuesta por esa relación.

g

Muy interesante la explicación del error, una línea duplicada que en una revisión descuidada es muy fácil de pasar por alto.

Mordisquitos

Yo de programación sé muy poco, pero a simple vista veo que si siguiesen a rajatabla el uso de llaves ( ) para encasillar el bloque de código de cada if, la duplicación del goto sería o benigna (si cae dentro de un bloque) o perfectamente visible como fallo (si cae fuera de un bloque if, donde sí tendría efecto).

¿Algún programador me puede explicar si hay algún buen motivo para no usar llaves después del if cuando sólo se quiere ejecutar una expresión, más allá de "se puede hacer sin llaves y me da pereza ponerlas/me parece feo/va contra mi religión"?

D

#35 En Go las llaves suponen una orden completamente diferente.

http://tour.golang.org/#18

Igual te interesa. Todo binario se compila estáticamente, ergo rula en cualquier sitio, sin dependencias.

c

#7 #8 Yo siempre intento que la gente ponga las llaves aunque el if sea con una sola condición dentro, ayuda a leer y a encontrar errores mas fácilmente

D

#7 #8 Hay varios estilos, yo personalmente usaría siempre llaves tras un if, ayuda muchísimo y evita este tipo de errores, que vemos que ocurren hasta en los altos niveles.
De la misma manera que para escribir condicionales hay gente escribe:
if ( x ) else

y no así
if ( x )

else


En el articulo de La excepcional belleza del código fuente de Doom 3 [ENG]

Hace 11 años | Por mr_b a kotaku.com
, por ejemplo, ellos tienen como estilo escribir las llaves siempre aunque sea para un sola linea de código, aunque al mismo tiempo prefieren esas llaves mas compactas.

apetor

#7, #8 Yo os puedo dar una razón por la que SÍ usar llaves siempre, haya una sentencia o más: las macros multiline.

Y si, si veis codigo de kernel -o de usuario, da igual- un poco bueno ( no digo bueno, si no que al menos sea facil de leer ) veréis mucho goto. Un goto ( hacia abajo ) es bueno para salir a cleanups, errors, exits... la arborescencia del código quedará muy académica pero generalmente no es muy mantenible ( y no me salgáis con lo de que con factorizar y separar en funciones hasta el tuetano evita que la arborescencia compleja se haga legible, eso es "es peor el remedio que la enfermedad" ).

crafton

#7 ¿Algún programador me puede explicar si hay algún buen motivo para no usar llaves después del if cuando sólo se quiere ejecutar una expresión, más allá de "se puede hacer sin llaves y me da pereza ponerlas/me parece feo/va contra mi religión"? Python, Coffeescript, Ruby...

hexion

#31
Hmmm... déjame que piense.... ¿si haces code reviews por SMS, te ahorras 4 caracteres?

Mordisquitos

#31 Hombre, ya. Iba implícito que me refería a lenguajes estilo C y no a lenguajes donde simplemente no se usan llaves (Python, etc) o donde las llaves son obligatorias aunque el bloque contenga una sola línea de código (Perl).

D

#31 Python y amigos es la mayor aberración que existe en cuanto a estilo obligatorio por parte del lenguaje. Si escribo código de una forma o de otra, es porque así va a resultar más legible. Claro, hay gente que no entiende eso, y la solución es no permitirles escribir mal... adiós llaves y ¿solucionado? Pues no, luego pasan estas cosas.

#7 La explicación es simple: al escribir código, lo más importante es la legibilidad. Si no, estaríamos todos picando bits en ensamblador. Para facilitar esa legibilidad, hay casos en los que viene bien usar llaves, y añadir comentarios, y avisos, y advertencias... y hay casos en los que un if "poco importante" está mejor un poco menos visible para que no estorbe a la legibilidad del trozo de código entero.

crafton

#35 Te he votado positivo por equivocación. No estoy de acuerdo, y menos con lo de aberración. Precisamente lo de la legibilidad es uno de sus argumentos. Si no te gusta no lo uses, pero lo de aberración es una opinión subjetiva y irrelevante frente a una comunidad de cientos de miles de programadores.

D

#39 Oh, ¿y me ibas a votar "racismo/insulto/spam" por llamarlo una aberración, frente a unos cientos de lenguajes con unos cientos de millones de programadores en los que no existe nada parecido? Pos muchas gracias, oye.

La relevancia está clara, y tu comentario la pone aún más en evidencia: el segundo "goto fail;" del código de Apple estaría dentro de la condicional según las normas de Python y amigos, mientras que según las normas de C y la gran mayoría de lenguajes, está fuera.

No verlo solo me hace pensar que ver "Python" en el curriculum de alguien debería ser motivo para descalificarle para cualquier puesto de programación, salvo en Python.

crafton

#46 no, simplemente no quería votarte positivo.

en cuanto a lo de las claves, no estoy en contra, cada lenguaje tiene sus propiedades.
Eso no es culpa de no-colons languages, es simplemente despiste/error del programador.

En python, por ejemplo, si no identas petada en ejecución.

No quiero discutir que paradigma es mejor, siempre depende de usos y gustos, por tanto es subjetivo. Simplemente defiendo que no es justo atacar de aberración a los lenguajes sin llaves. Just saying

crafton

#46 #47 ...y bueno me discutirás ahora lo de "si no identas petada en ejecución", con razón, ya que no es del todo cierto, pero está pensado para que haga el condicional solo si está identado.

D

#48 En Python el mismo fallo podría haber sido a la inversa: se te olvida indentar (o des-indentas sin querer) la última línea de un bloque condicional, y se ejecuta como si nada. Con el problema añadido de que si copias y pegas el código de un sitio a otro (ej: en un comentario de Menéame), toda la indentación se va al carajo.

Pero ese no es el problema que le veo a Python, que fallos puede tener cualquiera en cualquier lenguaje. El problema gordo es haber cogido una "buena práctica" como es la indentación de bloques, y convertirla en "imprescindible, y al mismo tiempo suficiente" para definir lo que está dentro de una condicional y lo que no. Convertir una "buena práctica" en "ley suprema", ese es el problema.

PD: y eso que sintácticamente Python me gusta bastante, pero el tema de la indentación me parece horrible. Python con llaves, eso sí que molaría... pero como son bastante talibanes al respecto, pos qué le vamos a hacer.

crafton

#54
PD: y eso que sintácticamente Python me gusta bastante, pero el tema de la indentación me parece horrible. Python con llaves, eso sí que molaría.. http://writeonly.wordpress.com/2010/04/01/whython-python-for-people-who-hate-whitespace/

D

#46 "[...] el segundo "goto fail;" del código de Apple estaría dentro de la condicional según las normas de Python y amigos, mientras que según las normas de C y la gran mayoría de lenguajes, está fuera."

Exacto, y como en Python estaría dentro no habría problema; nunca se ejecutaría el segundo goto, mientras en C se convierte en un bug del tamaño de un A380.

D

#7 Esto es un tira y afloja entre muchos factores que afectan a la legibilidad del código. El problema está en que al generalizar y/o imponer una norma, en muchos casos va bien, y en otros va mal.
Por ejemplo, en pos de la legibilidad yo puedo decir que un código si es breve, es más legible y, desde luego, se lee antes. Pero claro eso se puede convertir en una aberración, haciendo nombres de funciones demasiado cortos, metiendo llamadas a funciones dentro de llamadas a funciones dentro de llamadas a funciones todo en la misma linea. Luego está lo contrario, nombres de funciones super largos, llaves para todo en lineas separadas... Lo seguro es que sigas la norma que sigas de estilo, nunca estaremos todos contentos.

D

"yo estoy libre de virus y de trojanos, uso mac" dicho por un guardia civil de delitos informaticos

G

#13 ¿y que escondía para tener tanta preocupación?

D

#14 yo creo que queria fardar de que tenia un mac mas que nada lol

outofmemory

Evidentemente es intencionado, porque el compilador debe dar un warning al ver que hay código muerto debajo del goto. También cualquier herramienta de lint. Y está claro que en un código que tenga que ver con la seguridad siempre se mira si hay warnings.

D

#16 Pues va aser que no es tan evidente la cosa. SI buscas por internet verás que ni GCC ni Clang daban warnings en ciertos casos. Por ejemplo: https://www.imperialviolet.org/2014/02/22/applebug.html

outofmemory

#29 Pues sí: http://gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html , han quitado la opción del warning por código muerto a partir de la versión 4.4 de gcc
La versión 4.4 aparece el 21 de abril de 2009 y el bug es en 2012, así que tienes razón, gcc no lo detectaría. Aun así, me parece muy sospechoso.

Nova6K0

Eso puede pasar, por copiar y pegar código para no volverlo a escribir.

Salu2

vinola

Sin con ese "fallo de seguridad" podían escucharlo todo, con el que lleva incrustado esta actualización os vais a cagar!

Naiyeel

#37 Ahora directamente lleva un COPY TO NSA.COM

sauron34_1

Apple debe leer Meneame, porque acaba de salir una actualización de Mavericks que, entre otras cosas, arregla este fallo.

hexion

Noticias como ésta refuerzan los argumentos de nosotros, los nazis de la indentación
P.D.: Viva Python!

frankiegth

Regla número de una de NSA : 'Una vez destapada la 'feature' se corrige el fallo.'

frankiegth

Edit #56. Regla número uno de la NSA. (Ese tiempo de edición!)

D

¿Se sabe quién descubrió el error/problema? Porque el disponer del código fuente* seguro que ha facilitado encontrarlo...

* http://opensource.apple.com/source/Security/Security-55471/libsecurity_ssl/lib/sslKeyExchange.c

D

Me parece un método elegantísimo de lograr un MitM.

No sólo el usuario en su día a día no detectará nada, sino que si hay otro intentando hacerle un MitM por el tradicional método de cambiar el certificado del servidor "on the fly", entonces sí que le saltará una advertencia.

Demasiado perfecto para ser casual...

Varlak_

La conexion con el NSA me parece un poco cogida por los pelos, pero desde luego con esta gente no te puedes confiar, es perfectamente posible,,, como dice #22 es demasiado elegante como para ser casual

outofmemory

Menudo desastre de código, por cierto. Se montan todo ese tinglado del fail para liberar memoria si algo va mal, y te encuentras con líneas como "if ((err = SSLFreeBuffer(&hashCtx)) != 0) goto fail;" que te llevan a una etiqueta que hace un SSLFreeBuffer de lo mismo (!). No digo que no les funcione, pero es chapucero.

M_M

goto NSA fail

Amandy

Todavía no entiendo la relación de este fallo con la NSA. Está de moda generar visitas encontrando una inexplicable relación entre cualquier cosa y la NSA, Facebook o WhatsApp. Más ética, por Dios.

D

ademas evita estas meteduras de pata..
no se si sera que soy un paquete, pero ami me ha pasado alguna vez de no poner llaves porque solo iba a poner una linea, pero acabar poniendo dos y claro funcionar mal porque la segunda se ejecutaba siempre.

outofmemory

#20 Eso con Python no pasa

esparta

#21 Podría pasar si no se aplica bien el PEP-8:

D

Claro, van de pros y hace los if sin llaves... Las llaves son una forma que visualmente ayuda a organizar el código...

c

Buenísimo el apunte sobre la guía de estilo, pero creo que #49 tiene razón