Java 직렬화 취약점을 방지하려면 다음을 포함한 다각적인 접근 방식이 필요합니다. 화이트리스트를 사용하여 직렬화 가능 클래스를 제한합니다. 필터를 사용하여 객체를 검사하고 서명을 확인하거나 객체를 암호화하세요. 역직렬화 프로세스를 비활성화합니다. 역직렬화 프로세스를 격리하고 통제된 환경에서 실행합니다. 입력 검증을 구현하고, 안전한 코딩 방법을 사용하고, 정기적으로 소프트웨어와 종속성을 업데이트하여 애플리케이션을 강화합니다.
Java 직렬화는 저장 또는 전송을 위해 객체를 바이너리 형식으로 변환하는 프로세스입니다. 이 프로세스를 신중하게 설계하지 않으면 심각한 보안 취약점이 발생할 수 있습니다. 이 문서에서는 이러한 취약점의 유형과 이를 방지하는 방법을 살펴보겠습니다.
Java 직렬화 취약점에는 두 가지 주요 유형이 있습니다.
Java 직렬화 취약점을 방지하려면 다각적인 접근 방식이 필요합니다.
1. 화이트리스트를 사용하세요
화이트리스트를 사용하여 직렬화할 수 있는 클래스를 제한하고 신뢰할 수 있는 클래스만 직렬화하도록 허용하세요. 이는 RCE 취약점의 위험을 완화합니다.
import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class SerializableFilter implements SerializableFilter { private Set<String> allowedClasses = new HashSet<>(); public SerializableFilter() { allowedClasses.add("com.example.user.User"); allowedClasses.add("com.example.product.Product"); } @Override public boolean accept(Class<?> clazz) { return allowedClasses.contains(clazz.getName()); } }
2. 필터 사용
필터를 사용하여 직렬화 및 역직렬화 중에 객체를 검사합니다. 필터는 객체의 서명을 확인하거나, 객체를 암호화하거나, 의심스러운 속성이 있는지 확인할 수 있습니다.
import java.io.IOException; import java.io.ObjectOutputStream; import java.io.ObjectOutputStream.PutField; import java.lang.reflect.Field; public class SerializationFilter implements ObjectOutputFilter { @Override public ObjectOutputStream filter(ObjectOutputStream out) { return new ObjectOutputStream(out) { @Override protected PutField putFields() throws IOException { return new PutField() { @Override public void put(String name, Object value) throws IOException { if (value instanceof SensitiveData) { throw new SecurityException("Cannot serialize sensitive data"); } super.put(name, value); } }; } }; } }
3. 역직렬화 비활성화
가능하면 역직렬화 프로세스를 비활성화하세요. 예를 들어 서블릿에서 역직렬화를 비활성화할 수 있습니다.
import javax.servlet.ServletContext; public class ServletInitializer implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContextListener.super.contextInitialized(sce); sce.getServletContext().setAttribute("org.apache.catalina.connector.RMI_SERVER", "disabled"); } }
4. 역직렬화 격리
역직렬화를 비활성화할 수 없는 경우 역직렬화 프로세스를 격리하고 통제된 환경에서 수행할 수 있습니다. 예를 들어 역직렬화는 별도의 가상 머신이나 컨테이너에서 수행될 수 있습니다.
5. 애플리케이션 강화
특정 직렬화 보안 조치 외에도 다음을 포함하여 애플리케이션을 강화하여 취약점을 예방할 수 있습니다.
다음 예를 고려해보세요.
import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class VulnerableClass { private String name; public VulnerableClass(String name) { this.name = name; } public static void main(String[] args) { try (FileOutputStream fos = new FileOutputStream("malicious.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(new VulnerableClass("attacker-controlled-data")); } catch (IOException e) { e.printStackTrace(); } } }
이 코드 예는 공격자가 제어하는 데이터가 포함된 VulnerableClass
개체를 만듭니다. 개체는 악성.ser 파일로 직렬화됩니다. 공격자는 이 데이터를 이용하여 수정된 RCE 익스플로잇을 사용하여 피해자의 컴퓨터에서 임의의 코드를 실행할 수 있습니다. VulnerableClass
对象,其中包含攻击者控制的数据。该对象被序列化到文件恶意.ser。攻击者可以使用经过修改的 RCE 漏洞攻击利用此数据在受害者计算机上执行任意代码。
通过应用上述预防措施,我们可以抵御此类漏洞。例如,我们可以使用白名单仅允许 VulnerableClass
VulnerableClass
의 신뢰할 수 있는 버전만 직렬화하도록 허용할 수 있습니다. 결론Java 직렬화 취약점은 심각한 보안 위협입니다. 화이트리스트, 필터 사용, 역직렬화 비활성화, 역직렬화 격리, 애플리케이션 강화 등 다각적인 접근 방식을 취함으로써 이러한 취약점을 효과적으로 예방할 수 있습니다. 🎜위 내용은 Java 직렬화의 보안 취약점을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!