diff --git a/src/pentesting-web/deserialization/basic-java-deserialization-objectinputstream-readobject.md b/src/pentesting-web/deserialization/basic-java-deserialization-objectinputstream-readobject.md index caf0f1607..4e8331cf2 100644 --- a/src/pentesting-web/deserialization/basic-java-deserialization-objectinputstream-readobject.md +++ b/src/pentesting-web/deserialization/basic-java-deserialization-objectinputstream-readobject.md @@ -1,15 +1,27 @@ +# Msingi wa Java Deserialization na ObjectInputStream readObject + {{#include ../../banners/hacktricks-training.md}} -Katika POST hii itafafanuliwa mfano ukitumia `java.io.Serializable`. +Katika POST hii itafafanuliwa mfano unaotumia `java.io.Serializable` **na kwa nini kuandika upya `readObject()` kunaweza kuwa hatari sana ikiwa mtiririko wa kuingia unadhibitiwa na mshambuliaji**. -# Serializable +## Serializable -Java `Serializable` interface (`java.io.Serializable` ni interface ya alama ambayo darasa zako lazima zitekeleze ikiwa zinapaswa kuwa **serialized** na **deserialized**. Uandishi wa serialization ya kitu cha Java unafanywa na [ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html) na usomaji wa deserialization unafanywa na [ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html). +Interface ya Java `Serializable` (`java.io.Serializable`) ni interface ya alama ambayo madarasa yako yanapaswa kutekeleza ikiwa yanapaswa kuwa **serialized** na **deserialized**. Serialization ya kitu cha Java (kuandika) inafanywa na [`ObjectOutputStream`](http://tutorials.jenkov.com/java-io/objectoutputstream.html) na deserialization (kusoma) inafanywa na [`ObjectInputStream`](http://tutorials.jenkov.com/java-io/objectinputstream.html). -Tuone mfano wa **darasa la Person** ambalo ni **serializable**. Darasa hili **linakandamiza** kazi ya readObject, hivyo wakati **kitu chochote** cha **darasa hili** kinapokuwa **deserialized** kazi hii itatekelezwa.\ -Katika mfano, **kazi ya readObject** ya darasa la Person inaita kazi `eat()` ya mnyama wake na kazi `eat()` ya Mbwa (kwa sababu fulani) inaita **calc.exe**. **Tutashuhudia jinsi ya kuunda na kuondoa kitu cha Person ili kutekeleza kalkuleta hii:** +### Kumbusho: Ni mbinu zipi zinazoitwa kimya kimya wakati wa deserialization? -**Mfano ufuatao unatoka [https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649)** +1. `readObject()` – mantiki ya kusoma maalum kwa darasa (ikiwa imeandikwa na *binafsi*). +2. `readResolve()` – inaweza kubadilisha kitu kilichodeserialized na kingine. +3. `validateObject()` – kupitia `ObjectInputValidation` callbacks. +4. `readExternal()` – kwa madarasa yanayotekeleza `Externalizable`. +5. Waandishi hawatekelezwi – kwa hivyo mnyororo wa gadget unategemea pekee callbacks za awali. + +Mbinu yoyote katika mnyororo huo inayomaliza kwa kuita data inayodhibitiwa na mshambuliaji (utendaji wa amri, utafutaji wa JNDI, reflection, nk.) inageuza utaratibu wa deserialization kuwa gadget ya RCE. + +Hebu tuone mfano na **darasa la Person** ambalo ni **serializable**. Darasa hili **linandika upya** kazi ya readObject, hivyo wakati **kitu chochote** cha **darasa hili** kinapokuwa **deserialized** kazi hii itatekelezwa.\ +Katika mfano, kazi ya **readObject** ya darasa la Person inaita kazi `eat()` ya mnyama wake na kazi `eat()` ya Mbwa (kwa sababu fulani) inaita **calc.exe**. **Tutashuhudia jinsi ya kuandika na kusoma kitu cha Person ili kutekeleza kalkuleta hii:** + +**Mfano ufuatao unatoka ** ```java import java.io.Serializable; import java.io.*; @@ -80,8 +92,63 @@ payloadTest("test.ser"); } } ``` -## Hitimisho +### Hitimisho (hali ya kawaida) -Kama unavyoona katika mfano huu wa msingi, "udhaifu" hapa unaonekana kwa sababu **readObject** inaita **kazi nyingine zenye udhaifu**. +Kama unavyoona katika mfano huu wa msingi, “udhaifu” hapa unatokea kwa sababu ya **method ya readObject()** **kuita nambari nyingine inayodhibitiwa na mshambuliaji**. Katika mnyororo wa vifaa wa ulimwengu halisi, maelfu ya madarasa yaliyomo katika maktaba za nje (Commons-Collections, Spring, Groovy, Rome, SnakeYAML, nk.) yanaweza kutumika vibaya – mshambuliaji anahitaji tu *moja* ya vifaa vinavyoweza kufikiwa ili kupata utekelezaji wa nambari. + +--- + +## 2023-2025: Nini kipya katika mashambulizi ya deserialization ya Java? + +* 2023 – CVE-2023-34040: Deserialization ya vichwa vya rekodi za makosa ya Spring-Kafka wakati bendera za `checkDeserExWhen*` zimewezeshwa ziliruhusu ujenzi wa vifaa vya kiholela kutoka kwa mada zilizochapishwa na mshambuliaji. Imerekebishwa katika 3.0.10 / 2.9.11. ¹ +* 2023 – CVE-2023-36480: Dhana ya mteja wa Java wa Aerospike ya seva inayotegemewa imevunjwa – majibu ya seva yenye uharibifu yalikuwa na mzigo wa serialized ambao ulitafsiriwa na mteja → RCE. ² +* 2023 – CVE-2023-25581: Ufafanuzi wa sifa za wasifu wa mtumiaji wa `pac4j-core` ulikubali blobs za Base64 zilizo na `{#sb64}` na kuziunda licha ya `RestrictedObjectInputStream`. Sasisha ≥ 4.0.0. +* 2023 – CVE-2023-4528: Huduma ya JSCAPE MFT Manager (bandari 10880) ilikubali vitu vya Java vilivyoandikwa kwa XML vinavyosababisha RCE kama root/SYSTEM. +* 2024 – Mnyororo mpya wa vifaa kadhaa uliongezwa kwa ysoserial-plus(mod) ikiwa ni pamoja na madarasa ya Hibernate5, TomcatEmbed, na SnakeYAML 2.x ambayo yanapita baadhi ya filters za zamani. + +## Kinga za kisasa unazopaswa kutekeleza + +1. **JEP 290 / Ufiltraji wa Serialization (Java 9+)** +*Ongeza orodha ya ruhusa au orodha ya kukataa ya madarasa:* +```bash +# Kubali tu DTO zako na java.base, kataa kila kitu kingine +-Djdk.serialFilter="com.example.dto.*;java.base/*;!*" +``` +Mfano wa programu: +```java +var filter = ObjectInputFilter.Config.createFilter("com.example.dto.*;java.base/*;!*" ); +ObjectInputFilter.Config.setSerialFilter(filter); +``` +2. **JEP 415 (Java 17+) Kiwanda Maalum cha Filters** – tumia `BinaryOperator` kutekeleza filters tofauti kwa kila muktadha wa utekelezaji (kwa mfano, kwa kila wito wa RMI, kwa kila mtumiaji wa foleni ya ujumbe). +3. **Usifichue `ObjectInputStream` mbichi kwenye mtandao** – pendelea uandishi wa JSON/Binary bila maana ya utekelezaji wa nambari (Jackson baada ya kuzima `DefaultTyping`, Protobuf, Avro, nk.). +4. **Mipaka ya Ulinzi wa Kina** – Weka urefu wa juu wa array, kina, marejeleo: +```bash +-Djdk.serialFilter="maxbytes=16384;maxdepth=5;maxrefs=1000" +``` +5. **Kuchunguza vifaa kwa muda mrefu** – endesha zana kama `gadget-inspector` au `serialpwn-cli` katika CI yako ili kushindwa kwa ujenzi ikiwa kifaa hatari kinapatikana. + +## Orodha ya zana iliyosasishwa (2024) + +* `ysoserial-plus.jar` – tawi la jamii lenye > 130 mnyororo wa vifaa: +```bash +java -jar ysoserial-plus.jar CommonsCollections6 'calc' | base64 -w0 +``` +* `marshalsec` – bado ni rejeleo kwa uzalishaji wa vifaa vya JNDI (LDAP/RMI). +* `gadget-probe` – ugunduzi wa haraka wa vifaa vya black-box dhidi ya huduma za mtandao. +* `SerialSniffer` – wakala wa JVMTI unaochapisha kila darasa lilosomwa na `ObjectInputStream` (linafaida katika kuunda filters). +* **Ushauri wa kugundua** – wezesha `-Djdk.serialDebug=true` (JDK 22+) ili kuandika maamuzi ya filter na madarasa yaliyokataliwa. + +## Orodha ya haraka ya ukaguzi kwa utekelezaji salama wa `readObject()` + +1. Fanya method iwe `private` na ongeza annotation ya `@Serial` (inasaidia uchambuzi wa statiki). +2. Kamwe usiite mbinu zinazotolewa na mtumiaji au ufanye I/O katika method – soma tu maeneo. +3. Ikiwa uthibitisho unahitajika, fanya baada ya deserialization, nje ya `readObject()`. +4. Pendelea kutekeleza `Externalizable` na fanya usomaji wa maeneo wazi badala ya serialization ya kawaida. +5. Jisajili `ObjectInputFilter` iliyoimarishwa hata kwa huduma za ndani (muundo unaostahimili kuathiriwa). + +## Marejeleo + +1. Spring Security Advisory – CVE-2023-34040 Java Deserialization katika Spring-Kafka (Agosti 2023) +2. GitHub Security Lab – GHSL-2023-044: Deserialization Hatari katika Mteja wa Java wa Aerospike (Julai 2023) {{#include ../../banners/hacktricks-training.md}}