Msingi wa Java Deserialization na ObjectInputStream readObject
Reading time: 7 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na ๐ฌ kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter ๐ฆ @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
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
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
na deserialization (kusoma) inafanywa na ObjectInputStream
.
Kumbusho: Ni mbinu zipi zinazoitwa kimya kimya wakati wa deserialization?
readObject()
โ mantiki maalum ya kusoma ya darasa (ikiwa imeandikwa na binafsi).readResolve()
โ inaweza kubadilisha kitu kilichodeserialized na kingine.validateObject()
โ kupitiaObjectInputValidation
callbacks.readExternal()
โ kwa madarasa yanayotekelezaExternalizable
.- Waandishi hawatekelezwi โ kwa hivyo mnyororo wa gadget unategemea pekee callbacks za awali.
Mbinu yoyote katika mnyororo huo inayomalizika 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 umetolewa kutoka https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649
import java.io.Serializable;
import java.io.*;
public class TestDeserialization {
interface Animal {
public void eat();
}
//Class must implements Serializable to be serializable
public static class Cat implements Animal,Serializable {
@Override
public void eat() {
System.out.println("cat eat fish");
}
}
//Class must implements Serializable to be serializable
public static class Dog implements Animal,Serializable {
@Override
public void eat() {
try {
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("dog eat bone");
}
}
//Class must implements Serializable to be serializable
public static class Person implements Serializable {
private Animal pet;
public Person(Animal pet){
this.pet = pet;
}
//readObject implementation, will call the readObject from ObjectInputStream and then call pet.eat()
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
pet = (Animal) stream.readObject();
pet.eat();
}
}
public static void GeneratePayload(Object instance, String file)
throws Exception {
//Serialize the constructed payload and write it to the file
File f = new File(file);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
out.writeObject(instance);
out.flush();
out.close();
}
public static void payloadTest(String file) throws Exception {
//Read the written payload and deserialize it
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
Object obj = in.readObject();
System.out.println(obj);
in.close();
}
public static void main(String[] args) throws Exception {
// Example to call Person with a Dog
Animal animal = new Dog();
Person person = new Person(animal);
GeneratePayload(person,"test.ser");
payloadTest("test.ser");
// Example to call Person with a Cat
//Animal animal = new Cat();
//Person person = new Person(animal);
//GeneratePayload(person,"test.ser");
//payloadTest("test.ser");
}
}
Hitimisho (hali ya kawaida)
Kama unavyoona katika mfano huu wa msingi, โudhaifuโ hapa unatokea kwa sababu ya metode ya readObject() kuita msimbo mwingine unaodhibitiwa 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 msimbo.
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. Imefanyiwa marekebisho 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 mizigo iliyosimbwa ambayo ilitafsiriwa na mteja โ RCE. ยฒ
- 2023 โ CVE-2023-25581: Uchanganuzi wa sifa za wasifu wa mtumiaji wa
pac4j-core
ulikubali blobs za Base64 zilizo na{#sb64}
na kuziunda licha yaRestrictedObjectInputStream
. 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 vingi 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 kutumia
- JEP 290 / Ufiltraji wa Serialization (Java 9+) Ongeza orodha ya ruhusa au orodha ya kukataa ya madarasa:
# Kubali tu DTO zako na java.base, kataa kila kitu kingine
-Djdk.serialFilter="com.example.dto.*;java.base/*;!*"
Mfano wa programu:
var filter = ObjectInputFilter.Config.createFilter("com.example.dto.*;java.base/*;!*" );
ObjectInputFilter.Config.setSerialFilter(filter);
- JEP 415 (Java 17+) Kiwanda maalum cha Filters โ tumia
BinaryOperator<ObjectInputFilter>
kutekeleza filters tofauti kwa kila muktadha wa utekelezaji (mfano, kwa kila wito wa RMI, kwa kila mtumiaji wa foleni ya ujumbe). - Usifichue
ObjectInputStream
mbichi kwenye mtandao โ pendelea uandishi wa JSON/Binary bila maana za utekelezaji wa msimbo (Jackson baada ya kuzimaDefaultTyping
, Protobuf, Avro, nk.). - Mipaka ya Ulinzi wa Kina โ Weka urefu wa juu wa array, kina, marejeleo:
-Djdk.serialFilter="maxbytes=16384;maxdepth=5;maxrefs=1000"
- Kuchunguza vifaa kwa muda mrefu โ endesha zana kama
gadget-inspector
auserialpwn-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:
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 sanduku jeusi dhidi ya huduma za mtandao.SerialSniffer
โ wakala wa JVMTI unaochapisha kila darasa lilosomwa naObjectInputStream
(inayofaa kutengeneza 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()
- Fanya njia hiyo kuwa
private
na ongeza annotation ya@Serial
(inasaidia uchambuzi wa statiki). - Kamwe usiite mbinu zinazotolewa na mtumiaji au ufanye I/O katika njia hiyo โ soma tu maeneo.
- Ikiwa uthibitisho unahitajika, fanya baada ya deserialization, nje ya
readObject()
. - Pendelea kutekeleza
Externalizable
na ufanye usomaji wa maeneo wazi badala ya serialization ya kawaida. - Sajili
ObjectInputFilter
iliyoimarishwa hata kwa huduma za ndani (muundo unaostahimili kuathiriwa).
Marejeleo
- Spring Security Advisory โ CVE-2023-34040 Java Deserialization katika Spring-Kafka (Agosti 2023)
- GitHub Security Lab โ GHSL-2023-044: Deserialization Hatari katika Mteja wa Java wa Aerospike (Julai 2023)
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na ๐ฌ kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter ๐ฆ @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.