"value":"In the Linux kernel, the following vulnerability has been resolved:\n\nmaple_tree: correct tree corruption on spanning store\n\nPatch series \"maple_tree: correct tree corruption on spanning store\", v3.\n\nThere has been a nasty yet subtle maple tree corruption bug that appears\nto have been in existence since the inception of the algorithm.\n\nThis bug seems far more likely to happen since commit f8d112a4e657\n(\"mm/mmap: avoid zeroing vma tree in mmap_region()\"),whichisthepoint\natwhichreportsstartedtobesubmittedconcerningthisbug.\n\nWeweremadedefinitelyawareofthebugthankstothekindeffortsof\nBertKarwatzkiwhohelpedenormouslyinmybeingabletotrackthisdown\nandidentifythecauseofit.\n\nThebugariseswhenanattemptismadetoperformaspanningstoreacross\ntwoleafnodes,wheretherightleafnodeistherightmostchildofthe\nsharedparent,ANDthestorecompletelyconsumestheright-modenode.\n\nThisresultsinmas_wr_spanning_store()mitakenlyduplicatingthenewand\nexistingentriesatthemaximumpivotwithintherange,andthusmaple\ntreecorruption.\n\nThefixpatchcorrectsthisbydetectingthisscenarioanddisallowingthe\nmistakenduplicatecopy.\n\nThefixpatchcommitmessagegoesintogreatdetailastohowthisoccurs.\n\nThisseriesalsoincludesatestwhichreliablyreproducestheissue,and\nassertsthatthefixworkscorrectly.\n\nBerthaskindlytestedthefixandconfirmeditresolvedhisissues.Also\nMikhailGavrilovkindlyreportedwhatappearstobepreciselythesame\nbug,whichthisfixshouldalsoresolve.\n\n\nThispatch(of2):\n\nTherehasbeenasubtlebugpresentinthemapletreeimplementationfrom\nitsinception.\n\nThisarisesfromhowstoresareperformed-whenastoreoccurs,itwill\noverwriteoverlappingrangesandadjustthetreeasnecessaryto\naccommodatethis.\n\nArangemayalwaysultimatelyspantwoleafnodes.Inthisinstancewe\nwalkthetwoleafnodes,determinewhichelementsarenotoverwrittento\ntheleftandtotherightofthestartandendoftherangesrespectively\nandthenrebalancethetreetocontaintheseentriesandthenewly\ninsertedone.\n\nThiskindofstoreisdubbeda'spanningstore'andisimplementedby\nmas_wr_spanning_store().\n\nInordertoreachthisstage,mas_store_gfp()invokes\nmas_wr_preallocate(),mas_wr_store_type()andmas_wr_walk()inturnto\nwalkthetreeandupdatetheobject(mas)totraversetothelocation\nwherethewriteshouldbeperformed,determiningitsstoretype.\n\nWhenaspanningstoreisrequired,thisfunctionreturnsfalsestoppingat\ntheparentnodewhichcontainsthetargetrange,andmas_wr_store_type()\nmarksthemas->store_typeaswr_spanning_storetodenotethisfact.\n\nWhenwegotoperformthestoreinmas_wr_spanning_store(),wefirst\ndeterminetheelementsAFTERtheENDoftherangewewishtostore(that\nis,totherightoftheentrytobeinserted)-wedothisbywalkingto\ntheNEXTpivotinthetree(i.e.r_mas.last+1),startingatthenodewe\nhavejustdeterminedcontainstherangeoverwhichweintendtowrite.\n\nWethenturnourattentiontotheentriestotheleftoftheentryweare\ninserting,whosestateisrepresentedbyl_mas,andcopytheseintoa'big\nnode',whichisaspecialnodewhichcontainsenoughslotstocontaintwo\nleafnode'sworthofdata.\n\nWethencopytheentrywewishtostoreimmediatelyafterthis-thecopy\nandtheinsertionofthenewentryisperformedbymas_store_b_node().\n\nAfterthiswecopytheelementstotherightoftheendoftherangewhich\nweareinserting,ifwehavenotexceededthelengthofthenode(i.e.\nr_mas.offset<=r_mas.end).\n\nHereinliesthebug-underveryspecificcircumstances,thislogiccan\nbreakandcorruptthemapletree.\n\nConsiderthefollowingtree:\n\nHeight\n0RootNode\n/\\\npivot=0xffff/\\pivot=ULONG_MAX\n/
"value":"En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: maple_tree: corregir la corrupci\u00f3n del \u00e1rbol en el almac\u00e9n de expansi\u00f3n Serie de parches \"maple_tree: corregir la corrupci\u00f3n del \u00e1rbol en el almac\u00e9n de expansi\u00f3n\", v3. Ha habido un error de corrupci\u00f3n del \u00e1rbol de maple desagradable pero sutil que parece haber existido desde el inicio del algoritmo. Este error parece mucho m\u00e1s probable que ocurra desde el commit f8d112a4e657 (\"mm/mmap: evitar poner a cero el \u00e1rbol vma en mmap_region()\"), que es el punto en el que comenzaron a enviarse informes sobre este error. Nos enteramos definitivamente del error gracias a los amables esfuerzos de Bert Karwatzki, quien me ayud\u00f3 enormemente a poder rastrearlo e identificar la causa. El error surge cuando se intenta realizar un almacenamiento de expansi\u00f3n en dos nodos de hoja, donde el nodo de hoja derecho es el hijo m\u00e1s a la derecha del padre compartido, y el almacenamiento consume por completo el nodo de modo derecho. Esto da como resultado que mas_wr_spanning_store() duplique por error las entradas nuevas y existentes en el pivote m\u00e1ximo dentro del rango, y por lo tanto la corrupci\u00f3n del \u00e1rbol de maple. El parche de correcci\u00f3n corrige esto detectando este escenario y no permitiendo la copia duplicada err\u00f3nea. El mensaje de confirmaci\u00f3n del parche de correcci\u00f3n detalla en gran medida c\u00f3mo ocurre esto. Esta serie tambi\u00e9n incluye una prueba que reproduce el problema de manera confiable y afirma que la correcci\u00f3n funciona correctamente. Bert ha probado amablemente la correcci\u00f3n y confirm\u00f3 que resolvi\u00f3 sus problemas. Adem\u00e1s, Mikhail Gavrilov inform\u00f3 amablemente lo que parece ser exactamente el mismo error, que esta correcci\u00f3n tambi\u00e9n deber\u00eda resolver. Este parche (de 2): Ha habido un error sutil presente en la implementaci\u00f3n del \u00e1rbol de maple desde su inicio. Esto surge de c\u00f3mo se realizan los almacenamientos: cuando se produce un almacenamiento, sobrescribir\u00e1 los rangos superpuestos y ajustar\u00e1 el \u00e1rbol seg\u00fan sea necesario para adaptarse a esto. Un rango siempre puede abarcar en \u00faltima instancia dos nodos de hoja. En este caso, recorremos los dos nodos de hoja, determinamos qu\u00e9 elementos no se sobrescriben a la izquierda y a la derecha del inicio y el final de los rangos respectivamente y luego reequilibramos el \u00e1rbol para que contenga estas entradas y la reci\u00e9n insertada. Este tipo de almacenamiento se denomina \"almac\u00e9n de expansi\u00f3n\" y se implementa mediante mas_wr_spanning_store(). Para llegar a esta etapa, mas_store_gfp() invoca a mas_wr_preallocate(), mas_wr_store_type() y mas_wr_walk() a su vez para recorrer el \u00e1rbol y actualizar el objeto (mas) para atravesar la ubicaci\u00f3n donde se debe realizar la escritura, determinando su tipo de almacenamiento. Cuando se requiere un almacenamiento de expansi\u00f3n, esta funci\u00f3n devuelve falso y se detiene en el nodo principal que contiene el rango de destino, y mas_wr_store_type() marca mas->store_type como wr_spanning_store para denotar este hecho. Cuando vamos a realizar el almacenamiento en mas_wr_spanning_store(), primero determinamos los elementos DESPU\u00c9S del FINAL del rango que deseamos almacenar (es decir, a la derecha de la entrada que se insertar\u00e1); lo hacemos caminando hasta el SIGUIENTE pivote en el \u00e1rbol (es decir, r_mas.last + 1), comenzando en el nodo que acabamos de determinar que contiene el rango sobre el que pretendemos escribir. Luego dirigimos nuestra atenci\u00f3n a las entradas a la izquierda de la entrada que estamos insertando, cuyo estado est\u00e1 representado por l_mas, y las copiamos en un \"nodo grande\",queesunnodoespecialquecontienesuficientesranurasparacontenerlosdatosdedosnodoshoja.Luegocopiamoslaentradaquedeseamosalmacenarinmediatamentedespu\u00e9sdeesto;lacopiaylainserci\u00f3nde