安全研究
CVE-2025-21756 Linux Kernel vsock UAF:从 socket 子系统到 Root 的最短路径
Thinking
2025-02-28
3 分钟阅读
研究档案
#漏洞分析#代码审计#恶意软件
Linux 内核的 vsock_diag_dump 在遍历 AF_VSOCK socket 时把 transport 指针(sk)和 vsock 指针(vsk)的释放顺序错位——攻击者关闭其中一边让另一边悬空,下一次遍历就踩到已释放的内存,逃逸到内核控制流。
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a47062292625ea7240d146fb061f3975a6253d117e97272d7df5aa897fb9fe2c09034f658aae2645a68076992d7d9de07ae63e2fac88f85e475412988dfbc9227687ce8d2f6e0cc05eab1af0a1040b6b95a6e77906f088c6aef278e6d9ee4d819df556e9645076dd4dfe166749f854d71375c975c31b778ac24cda316d7beb63ed857004edec6e61ea95f263b6ac7633577b1e2035eb48ead7e3008e5f08634dcaec2c049e7bf01e16be81f8f38f4b9f9cd15e89b48e9c6cb38628a2ed0505df82c9282bdc3a87a1c977ee2802120b690191fed2dcd75b47ecbc6bac474417853c21b6039319131af62d87a2be11661236f434153f7b92321c54f5a3466634f4f8cf66b6feb959e4f2876a5aae6c2641ed24bc3beeaeb11830891bd3b16c6770afcd5646f31916926f2ef127cc61f7a65125db78a23ca23e4523700d22a38ee792a7c38081db070c79dea42b322744daef62e4fa4553df30f3212e638d82fc863f65def4483b3cdf16d78b510f12d2b2c5a90c1ec90c3326e9e55f01cb35d3cfa9425f08f2dbfa137a6f71fac5b5ba96e29c9bb5095e7c8f0c2a10adf2a6887d049feb7602b5139c30999d1054b8a303fe9550b59464fa9e676ebdfaed34531d0d6253285d487d23cd5772a965141954e33b27c9e7b27116034f614fb6a0fc3eb7907b7c38da36972d755a980397ac55b07b08e696fee72bd5d9e9c369174ba405d67bf4811cf3d322b1078643f881cd0aa5600c3e80af8aa119f7927c8fa52dae7d419207637cb9444a5c30ccd644bf7a60786a0d0a372d641aacc0c734dee45539bf7e3ae73092fcaba24c9d86798730b641df9be8ba08ef9fe59910e7e01c3916429e61244509c66a320a8ab156d4da21fd2558bf7de6e88c361bb898d90a82d081c2d164496cf71762f9a2fde82b626b5a14dee0381212e107248ed8797541a03eeabfe49305df6fd0d4f1beb901ab3bbf4936e12a019d548e1adddc9956f5e7ffdab4e440b28a8874899aa413fb9e0a72537fde6e573238e88f984fc6aaa52eaf2e3f1c7d3a0c51fa9ff5974d618dc52572299fd19d6ac29d7072bbdf8c0ddd34308740ea1712a2697e77b0271fcc7d90c1bae6bbae5088001a5aa5d4cfcb6840e0b2a25aacf800dbc39d19214578b58023ed2c41be3ff1f1a7688728d987d067c780d0287aaec77a4529d996d8274cdc191c5597a526d5d460a8d48497a2e433d90d2cc78135691c608ed5286fe9c5acf98ee2beb6517753174e8ce9b142a8d7445e344e3e083b711a0619b3c7f001c06611adc31e665d8b1097ac0b77dc44681aa324707309af17407acaf9a20e9185f48ef61fc3f73fa55c82387c5e1d0e6d7d96b54b13ca7af23b6f20171cdaf3e2104c0a8d059c5103c762ef71c69190c7f47728568532dbaed325431a38b2ba995d3f50a42b6ce607de4384321ce0172b1621b4975b2fb8962ff0848cbb8ff2d445e733941ece137f236f76c598496a416d2e4dde89da2531c55651a3a6625de5ffe313bb6fa26f3de3e60c24872531718e290d3af8473293822e728961270d7a1df796318a0ae15faaf37e6ead52e8af16e92ba6174c77bf36052bc3f048110ee05e9b5283e354c588953267ef7ea4a062fb08966c779097807d4b776aa86e5373b1ec48bb73d1e14a815fbe463fcadbf5dd026823a7f899da67b0bba8b69344aa13768eee3b2ff00c5301639286418fb55f2da0f696368407acfe7b9376f70fb96514079dcbd78abfeaedcefe46f6a459c86bbc2bf0351bb98ce169590f71b396403722bd4607e75026fb074fda9010551269222a421b351990360079ffeb6739c7d1ea3e0d3aca2e849891ee169e529a3aef1bffbf2fd5261b5659c7f5df57e1e3a9b99fbfabe80d5485cf983b93c5585947c4cc946b0347abf52f7daf544ce64ee3ea48431544b837c2ecc670cc03c9ad48510a12cdc3ef4a9187f289e4fdcbe918a84325e2a14ed1dc68bc0b491ea5523c0b9f03b7719b09653882742fb4cdd0e250c5d2585209f2f8d7a1be977edd3a943551c09c0775ca0438f40ac1a3d13f330c2baa05261f0c383ec7e7ca220054795124487e8fd3514c790d99cfd0289a397807690fd2a2383cb2a050ef3b6c0dcb09240517d2a2b7a1245e0cd21819d1a93f310d541359fd721d78c215db18fabf46a6321a068a821cde282fe392083f5fc1165f151bde7ef59066c7e9ae55f6eecf511c64cadcf4d75cfa3a401c2a362e60ee2e864a595053862fc4a3042be5f405e6b49abc5b9af20368bfd5be9bef47fa2fded7241cf2ee6c66045aa5cad4bf06b6725285b5fec4f0e06e77e7d8386fe00a79d646ecd68ffeb26a04a9ba6fb25f16d21033168d6feb7d718c97f5b6f64b4a8aad017e7b95031e69fbfc59784b3ec30b32aa45e4c99ac50ab9bba1089164c9467855a7d4cf3e46fd9eb5e786550d443769e6555ee61cc0166013cd2ec523b4db9b65966a7182b48a724e2095768faf4601561b915310610781264c83ee17588a6d7507f2cdf510f94e8bfd36c6cec5bf03539b8055a5de78ebf9bd454a12e4dc3357868822edaa288c9e944bd7199b615d285def0eb786f83acafd046485dfa56a09e2bc73d4c9cdcc485910e85b935560d53e4c0f29256cae8f8c9638a7f82f3f91a97e9fd81458fd887091101eb2b3a8554598d894adf2ed00916e3105670077bd83a43fe501b67cc59b6dbe096c7ac0df93908e4560e68e5b20c6be13766f35d0633d3977b2ad45372cf5ad97a1d42c49c90a88804ef25afb0ef544417245906fa2bb4e6cd07b229ca531d4ac54f9b8ce1f7b00f68fbfa636ac92a7059856e597436d5e9ce4eefbe5db4945c93e2b11c6766fb84c384935f6abe9afee17e08c729c7bc20ec662f41dd75494b432f8431153a5a2ea76f1340813d736089acd68ae9f08423d9b41ae32902aad2eab8a5da890530bb4240d2e91c0a309dea2129dea081dff185fb9197c9d203099a1c9763408e31ce6bb3457dedc081a353a430eaebd80ae2f52144cc0482efbbc59bb189f922a2a161ed6b3b38543e236136d7d57035b4d1d06ecebd5c1663a9e1852e06ee174a178826a2dfa2544163bade7f6ffde1587eee81fedca3933df9a3f8831caed9611f462e36e5c9eb46e1f8bd5de6ef758f50989e2cd38f1d7b0aca61f1158e5d6182927b2835047981c752931a75df6658571687514be946f4084929dfaad543406ebbf5f5f6e77fa6b648cce7e45136496ccd246e24e7404d87037c9fabd77469cb641f407e8210e3d06be22a77e553114c5a52731922a716529db495ac4c3cf0a8b31f97ae1bdda6e7b894c5650b0804e46a88f8e8b323b12488109eeab2f37ca852e94182e47ec5c352840557e4f60a6c301d6f947ed460eeaf6868aef97eff4555735217a6eb9b2e8522313ae35bae3b52ed86e7c79c2244b012c63b5d5b68cdf5c840da8fcca7fcb8b8e2295294fbddd025c928c4a85957bc07f451701eb0cdcda15bdd564f27daa346655fc83440a2b74f29ea33cd645213d8e59e80b774ce7e5acf84cbd10b112b94e799ec2ba6b96edc8833509ebf8f01e4273518abbb0d0452b40de047568013954da66815f493fada878de3558aa67697b4c07b23311e4deb62759dcec53006fd78b3c5b8d2271b37aa1b269c5d786056a6b08e1b291dfe286ccdfc5ddb926417df22bbbc6f4b933b37f802f9b8a5c26efe8ba90622bb8bdc8d405d4b2643d59a27ee4e2badbf81410c304ab143360cab0cc5b27787651ac2e267777669832b1103104c27c7b88c662ec16ee9d0076db3fef4dd7fdf6b7f6cc572f50ada978cfa9da8c451dccdc5e0eb9a75b4b7fab3de2675f1931ab438b4bf03f23be454a9bbb86f79ffafb388438e324afd98a2dc19ac6d984b794485cd80ae90514b4be8d177ba1ff3339796571d9f9076d5780183620e82e166f547d9f72da979050070478df12a24b59f1c059817bb6126941a17e9fd0efc40f4cd1dfed7f6978ff5e563d7d0e576b9aa4b3fdbeae18d711f5f291815eb84e43139d881ecefc37cbdaff3b1eeaee9b8ad02b03433c3105a070042d955aa610bcaa17d9e4b17fd4dc27aafb314a5cb869450834838ed506aaa44e3852849d26ded787648f0c434f16dfea062d21478ccc8b7245621bd5c53929103baf653572f38c3c05a0bda5aa898be6cfb679fba50f3ddb1ef55b4ccf7a64f5f0063bf5c21b445c4cd3475e873ef3f3578024a5f99a518ea638985f83f2c752ba5379972f72c568e2ff927d37637e1f7a53a80e08fb5c1f1f42351ac71f6a09aa0d09638a89e6320d4ce1982b43f2209f218b640395cd08bb7ff830e99e808eb3e7e351ca103b1738b649e8275a106e8551e3b255024517e6ae5c469a37c97df8e0bb768670f429487874d498724c2399a73a5dd7c5652eb8e7ac1bd38ddaf2fca8051b0d6cdf154cd2985c020188091471e84be2849f306058a85508e3c6a00ddc523b5348a83c1f496d6394117acea759c1885f883f91798ced8cc6cd23c8cbe0d783dec8ad6dbbac9c1e49a222cdd80068038ea685d077a9c13d76c5707931336b3a6702121651d97aef4d16463005851aae966f139118a3bc877ddd6acb9ae88e515f340aab2e6cb55889e0c2546bb7d38d29d74afd8f5262c5ac0968cf39579c00f5c9239aabaf6ee4df1d223b319224f5c5962f6a1cc85c404f97a6931631aba45861bc45e2eca78d1065b7111eee4d694ed85e48665eadf87fa297da9da18f6624229e032d276f5a3b2a717ee6143c50887d5c6bc9a124f9853cdba512a6120261b4af9ceebb4fbe84836be2e59a207faf2439c41b103a142287bc5dbc666a995718453ec1aa01ac8f053ad931ca8ec8ce454c31474fc5b31bdd0b4ace5ebd228a9fd0db0f5fac9a9d770e22a2bda0b286eb431c3a0f1bf4f5d577382d8cc09a167338617f8d28bdfd2f2407b3d0e3bba02632a342a7bd92ae1fe67eaef14cc450b9689d9965d225295a0d768ed93424f076edef47038e2dc685152a65f84bc6b4de31b33a6d5dbf7b44e1fd5d260c9f0fe2f61a048fb3f59afeaa35e28248404008d120e7f61b622526a0e11bde6631c678901c74b846bc6be0253d128ec274bf897b49cc709bb3bc96e59312569fe30690d03672f81dbdb78b6257c3d46e2eb73800874a5afeddabd3b98c22216d7102a19c829cf12bffe8438c56a3d3bcb74d342795052ced7503fc81043cd1414359b1d70f2d094b65ad968dbff9f9105fe4ddebeb08233e9058dbe49cd32d48bc57acbd13f9385584c57cb13cc492a203bd3ed81198e4ceb96accd69adbb87262d2a866cafdcc3f350b06741b560f8057089813a0870936cd8b84ed00ce75a9854c8835c1ffbfa1bef6cc54c6a50b01f0f3ec1b318bd9ca9794628c5664f99d024cd212477b4df539a19efb2e29a7c6672a09e682b01d6b87886105d1fbcd3c56f5a7a716131482eaacb4d2a885037a13e1ab9cb48e7376cb024a2e4ada4ab59de0b23e0745a82367fab57d34303b811cf2da08f6c17a3955683fbb297958aa5e591b53471237fd23d9a81cb4e232c1460a4350dca947ca057ebb4e9fbff294fc42006ae192e55adfa67be9d65763c3a1aca4901162f05049079f1aba5a5e205a41b7a8a6a35577b6f03bc05219b5b889c2c80eee4102b8bef9d1144af55334ad3465bb489b98c7ed147bec86541a688b9b59271afbbedfed0f1dc90efc76f35bb73bab0b378bc5d681dda78da941a62ff3205387806648214044890b46b32c342e482fb6f237f96dce3412ca587123e3def464ec7a15046170061471cd4850b2b6fb0ae7c934a2ba9ded239828411f5446a5aabbd97212d296a8738a75756ff77ee812c18a5bbccb4f16218e00cf1e3ad622316d14671622df6c05c71a5b2c54510da9b0a642a78b030fd560f36f8e662df11dbeb5df7737bcca47488d2d26e588cf296d009f1b8b51ca7ad8b5c9d1b82242f465e7018fa87c2ddbe3dfd051ee066b68c4332d872acd21d8a7152d2715f5ef3915522dcd929edc924b47d774072b9d8b2ea55c025f9627be77277d54c835979380a2955067b747531bab219eee65c6fb7b8f1e017a45754bb372b049d3fabfb05f8c5688f4f992e2b42a8282cdc3dd20c24f13a2bba33d2b7dc22f2aab1bd913dd5e22542948ae13d8c65bbf6a5db9ec4abac8ead937961940ee7dab149b8cbb1f02ea898962751baf4b5d001dea7bafc50c6289fd1205f20552f9bdcfa94808fe330a578b0815431c27f4dab7bccc006c07c26f91f7fd18ece388cb2366a9d1c4e60a9cc336dfb3c5bd63dcc81562cbe82e4ecb5b785f1a99759bba049fed4e37ed6945fbe7b6116789f2c60e4ac6e08cb709870088a009b404a198bf740b63957b9c77aa0265f6f828ba07a701f3576a73181cf9eeee42bf88f6c15d1841c912843d4248e7f6a1bc4ce169af4d10af09793766ce86bf2ab122f311a1d4d8fb6f14301a87275ddcd12800c23baa091fe3ee215a686bdd4403ccb3599f97d1d946b9e2f49565c7c146653eb3040ad493ec0c8790109a741f9fb8c89cc7af4f5e20d0cdefbf567c58e2aeaef1731d4429175cc94c1c107805df23e5ecea63884e7ab0c62a1bd8bf65e32c1085260449afb3d4fc9a038d8b36d4e8caeb2879840732b3da0ef02c2247a6541edebe8c34eedb9bd85e487855b28407a33fad214635dc5ad284a07396d17b4641ca33e4260ef3687fc59240bd5293bc0c00f9e18e7f65f57013b6f9d3f99148670df413ffced510c7ea7fc2c077b5f24c98657210c44c3e13c2203a17d7047fb0ac5b5a4f35a232fd4031992ed2a0fc48c9c36c5788487cec0f0873d1e4b335736e70a722f20a21c9822fc96987547accf8863ed874a51dedf0fde00d7bd69ed0b9ce337f57216988436a291e5488e8d66c68d9ad1d97ea84e565b914b487c34bcdf7df6e654cbda44d9eac538d62fdf9d64511c0b7bbd5b49f2f745a37e6fbe13632f45f933c957bc9bbe755f9bfd09cd7d02d4940700794732aa07a149337a2275669341384d7ab3bc9fb4464e5674b2928783921796b33716729c380258078eae010e8cc0b1337de6e2105461c6f7c8fa58830a1b0276f78411bf1388965515b835aeb634b87afdd5417ff1393912550059207cf1b59559986525f902f4f6117e40875851e8f69bb5ce7e6ee444e7f3d33c78299eefcf3840acdd7d19fd2cb60d6213dd030d8312b06e76ab6da5d957a9fe9c113ae22ef65069411a5f4b721e4a80814499510f17939399424bbb20b92d1642904ecbd15da1998220891e1453e851af76396851aa17ce94c4ed22db58e0c3b6f70f7dce6fd41da0155835fdc250c88c92f872ec88b940f46f0e9f0f8d3bf7f0313e5d2c73d7056bcfcabf917cc2e03eb7848cc73459a11a53d527620dfa949f5f73e2c6f6eb25b4beca74a740310da50dd82f7f69f3e3e21e4f8b6660bd1d0d83c74530a162adb4d8468d7182173b8a79091727e57e4f27620ce9a73cc0d7d9724648e9691b94ba652e8d650de7027a71c8a71e0e8dbdc7d8482ff6174e60eea13b6a7b102301bf1a0b34831f997a979252b4383cf1985e3461f74ec8fec965dcf3e535a8af7dd5dd7ccd050ac9d378cf1b05ba931614a00477c31f166ed4059d2bc7c9c9473e115ff5935f6f5eebaf81d21e4ae518f6a66fee5893088c8769bd5702e4a2da2855d48dda693f6e2ab069687c2a1b2b6a049d84f363f9547da61801b12b17a227c524f95bec972cb8b02ed12d7acb5535ab26235010ad5c97d26f388f6cb5b2630eff21693e2ebd63bbfedb60376537afbd5fbdbe048e1e373e3c47a58dc18b04a7fca778beaeca381c63cb9e6842f49574b362ccf8137e1ffafdd0c2c0d2a68f2c98e7ed2d8e903d2b661caf31630b495c42cd19ce29a18702b3f1d69b8ac6855a9af0b94788e1a90aba9a2fb3fb7ae2dc055af14985597da45087afe0df6c5d9fa1bcb2421dfedfd4d7f46c90c6dde47bea4129620c1176f9af9e4d5ad42ac77990eb53d325023136a1a1da2cb21e29b8def4c2b611498c1f8c03c6f16d033c51837c0081c781a5f43b7e1f220ef1479ec5d27002ed9e694e20e822a2762141275ca398e9cbb0f8ac764c9734083f932fd3aa39cb702a128c7aa808f018351c1dba609d660a1bf47846574afb1b25251c71839f957b6097485326e68606f643e0cbac4b707134738719714f2d014c3834c601a7b7acd21c25ef14c06555ddf3e96535c0225bb7c19bc58eeff4ab28278580d95b6169efe36dc8db83a1319779fc3b72c8136a3fc9538bd90cf85212d4a73f8717a3d0824df22c8a60106fa4be2a6e3f7e4194a273143cf049b1244db1d9a08238a36f21d8193163bb54471934ef0e72bb6a3850856e3db614e2712a052efd99e32dd1524e0a929ec66aaa83d2c22df28418d229b469a383fe610a3aba6c032b4f367b5098907d6095d3b91bdeea34a7bb0bd1026f790a6e48c3de806dce9023e78c5dd48f8580a56930635eea3e7086c2dfb1e12883cb58da520f0ea3079c79c6d41df47d8b8498afb4ab1f57252e086d01a667885798ecbbdc1cbd9e33f731a2965c59c1722b4c9b63e0792e2378e2fd6ba9d7314109f0eb6369ee86b0440c25cb05f8226dc0a0c02b4d5c5a8ec62a5a3757704339ab9044035c12915a1eee1a6a11456665a2c5fe7b9bf77f9344e1e82913127329e162fa7e9b770a5558690337af585d8808524c819380ffe9777d92c3a1842c5bb389ee7b71a45f0f0d6ffed0011474e0e8d928562a2fe5c2f1b51eebd75df53f6164a423b0285dd2e7aa4fed6f370fd830d960e4aa8f7d7da309915020e80bd6026eb5e9d2429cd06fca85b60c10c7d602d0c78844b1e90b5ed15a33966c1f3ebcf9abe260090fc0d7d910724c6f7ccbafeedf71a82b6ba44f6305ef825b303ab85cdee806be8b8f515dc71ac18ad1a2f288d07fb9a578f87a359ad6928946b0247586fc46f1c68fd79cf68063ed70648510e574a73a08d7207411e5f4a03bfbe6f5f4ba7eab7f3ed965058c8e3545d760e373b776c402550f6fdb3b39990617ed703699ea9036ad0d6104e0a2c594b09e6d674432e9964ddbb6c342f3367255c1acf0c2c9646f62be5206ccfaa2c72a0dd465d3d6b46da19505142ac8c176b4b352aa0772974b7d5a7b443b8933146af38fcc54c0cefe75fa4714ff80c0bd8995ce8f418d7caabe7ca38883d6e663a6c9c18ca2a51633bba2162f1d6805e27fff71b6c712fd3ed198622762ba49e1b8e1bc98788c86c30f447f8a549f1a4e5e9a935658e2b90b7d3b44afdb63af89870a73d539a300af3208301eb0194a69dd9818de31f0a6e6abd4a88f85665b440239cc11ba04bc5db530ac8077cbac3f20777fe9c12c81bbef6a49cdccff1df12c0042e1dbc372ae9fb4c92ae36059d3db025f7d2f17943408204a67153baa5cfe97d0558eb4fa5195e14e8419657a53f3823f2aa91e0bcec97ee2990d53af1ba7a5a26ec0b34c47425b6fa9c324304aeb3b397576e408e4db069a0ce8e09063e8f4eb0ad504b699977501ba7e95e3492fe9720438b5e0df97cac79b55be4a5819fa4751917c8bb0ff17a3d0aacbfc0809b3441eeff5666ade2d71aef28623adfec398d9ddfbbaf1a96c89f13f7ea914c70f5c7b40bae6bc23759fce7d2a75972c8b35cbcb77b7748264ecf1c5e6676d988245579c06f15280e815ea510ca8fc5856a6789845745e0959f0fdb78694e471a680ead67a1a61da2e07efd276bd58c149db1df1689efe82111c38ec597a39929d680d03159fefcc0ca7d59d8e747cbf8cdbe495f4bfd0fb9fa8fe5e653a6217e12e35f75795349c381e33b2013d36483872b5c89f2cdd7eeae55db62cc3d53fe73f5188b6d0e96b5b79cb789624f3c5f7a027f6dffd10270e96051636703aaf9b3cd9cfaa9c938b5133ebab159b7a469e538485922eafaf68b909fbf19b12d9851633ab177fdf7387b398c6d01ee2a4f6d6d2d5e30e8930407abbb19457ffad0cc3184ed6cc1ec6fc6096f276cbf0c741778dd8e15da8ac1da0eb7a36642dd8022433dd22881272e429871df64d0a38b596683664f45a259200bf212dc51a0a9f9a3f03861b66ed55d776be791a86dfa3e19cb008d23a807239a7a4d25616f3626119bfa20f8b855504e923b4196f06bb77b10ae16adb186fcc81731c894e580a38c69b7d41832b819d3255e89c371777f51f2e11589b8ff1a9c1c3e7cdb92c031a1b51986384d4e6a7097e714fd965303a08829485027799a17678cc02cd5d6cb840d0d5fbd2be9407b1d139a2117f01a799d6cd8b705de9fb4647e74b1a097ec3b8828069381bba8a2285b7cb11498b4e5a70ed41e8a9d36c20e4293a357a7984b34a54c5d311e70221674ee5487a6c0d6d5f7347b9e73272d79f31534098f10bbc5519532d58d3111b3cb8652e192aa797e05e1b71f5f74887a27c27ce6a7e96aa660b3ae3585d33abf16138090f3924e263b03d12ef337430d5e66842e2bde777f19090e25de4ecb3b543884b70430c3beae7ddd278687432628f6eb25b2b3dae47c324d645ae8fc31acae680b53b3e22aa3365937df5b26d872b259f11578f1129469f100ca210135197594bf7dd8feaa44d1a0d9d0086e517c1fbd6eb58275303e77514d42eeadd4062353c9289b9860a897880a100f961a41116ee537f82af59e8b4bbaf50e3206edb28fdb849b2b9c12e34abad4bba360ab1c8661e4224cf264a3c0e1aad42ed41f95f3f60708fdb33f79f3d5356d6a57ff9d449869a94298c4690a359eca0b60a6ee0355e2cfdcf85fe78617f6bd9baee4ead2e1a0fbdd538eb2f1e7fe504efb6f648fa38c6da1cc6015f8e0c0f95f97e965b0362565c442ddb6238aa8277f2fd91149b52799eb3ba60ae2fe3179f25ebc52fb68d8b2aa6e80545be6ab5939bd12372f23872b883013518ae1645a7da6a7e3712fb0acb5ef02cd85b77e7229cd7d5f79b273d6b403b91c83635c28113325ec79492d3bc9df4b87ff6092396242f80a3a45a18d472ea3ee3c98685d32eb9974235740b9c58349939eca1556abfacd1ca7dabadc364a1e454bf988d58a024c3f7a0c8462ab1acc161c5cca3a04b84f9b00331fbd69fd0ae2efd536ddc13f183735e89d1b19872ef528c0204d35c5f264d2d0c573468f67a31d90a704c7317c6544602d10ea2a84be38097138fce6fed73a902cea0e137a6ce77732b94290c419c3d3bf51e4cc01a99f33354abf39a1c474b1fc829a31d0aa3b5e67fc9337f8f445029ab1b6671e2b782e092a45d6dbdc4df4fb456ae18fec5d472466c8153e904c3e47532d6bc3be22e36263d4357b8799bec66808c7d349eff5af9357b89c70fc1de1dcdcd71ed1f03d9af2cbd96c145dc2c0d963eeac378db161ab35d2478f193ecf5ce9ff626b9537abf9b51b69cbdc4b4ae2542d8cca60d04740b13eab7d200cb3ef3bef2fe225347c173a4ad0a389da1f1f5424f20d75c96056d211b9d7d1340be71b6a38b637ee1836a709483abdc36faf304d469c12c5891698bce3e02167bcd4c065009c7010a560470f87d09b3e1a21aa619a8b702e937890463098a4f681010cf3f61a12c9a63ffb96d714c5b7d2238dba297ceafd75aea0ef9def2507d6ec26280cc1a07195b7d9c46d8eb3a4c3320d437bc5bbe9c0d3ffadebc165f1b9d73ca68e063ee44cdc26f29985a3759789bac80bcaa0be3126d01dad8d02309d9d78153caccf230922c73cf9f0cb9e0770109b8a5ffc5b2cbff8790e70dfbe829a4100cc4d131eb6842f9c4ac0ec20e652357e80aa00e6a33d7c4cd6ca8b3c4cbe525ef9720274ddb1d32128ac8c8960e14d4a0e71c4dfde45e2450762f443365d8dbd4941a711785bcbc7e94874d355626752adb524457fc7a8ae441fd625b96854e5de01f367b5718f8648f954fcaaa7ea7328fab1de453c32621098c785fed9feb8b50615e3cbf8eae7b19e8f39548d67b0a437e7f143c2dcfad428df9e30d51a472698acbe37397dec376f8fc8701ababaa0a76204613f51d2087a5a5af0672950f202db59a21c143803a3b421a5726c4da235cc0f04d975b0fb9af39a7cf3120a8c09bfcabf008809fb61448acb2d3b294af7f823248a76720287a43b0dda723a87ddb0a53d2a33da4ae091b5a66cf43aa43a3f77486495e889a280176a0febfb9340ee4a42d86136adcf53cd5ca6504e6794ac37d6545a57ded81663db5f20600190573463e21d4662271e7454e8f323f0d934fdabfc8bb14318c00aceb8e5a5d1fb7c271acf25e28dae