소개¶
이 문서에서 제공에 초점을 맞추고,명확한 실용적인 지침에 대한 안전하게 deserialize 신뢰할 수 없는 데이터에서 응용 프로그램을 수행합니다.
무엇이 진행¶
직렬화는 과정에 일부 개체로는 데이터 형식 이후에 복원될 수 있습니다. 사람들은 종종 객체를 스토리지에 저장하거나 통신의 일부로 보내기 위해 직렬화합니다.,
Deserialization 은 일부 형식에서 구조화 된 데이터를 가져 와서 객체로 재구성하여 해당 프로세스의 반대입니다. 오늘날 데이터를 직렬화하는 데 가장 많이 사용되는 데이터 형식은 JSON 입니다. 그 전에는 XML 이었습니다.
그러나 많은 프로그래밍 언어는 객체를 직렬화하기위한 기본 기능을 제공합니다. 이러한 기본 형식은 일반적으로 직렬화 프로세스의 사용자 정의 가능성을 포함하여 JSON 또는 XML 보다 더 많은 기능을 제공합니다.
불행하게도,특징 이러한 기본 직렬화 메커니즘을 재활용될 수 있는지에 대한 악의적인 효과 운영에 신뢰할 수 없는 데이터입니다., 에 대한 공격을 deserializers 발견되었을 허용을 거부 서비스에 액세스 제어,원격 실행 코드(RCE)공격입니다.
지침에 나열체를 안전하게¶
다음의 언어-특정한 지침을 시도를 열거하는 안전한 방법론에 대한 deserialize 할 수 없는 데이터가 신뢰할 수 있습니다.
PHP¶
화이트 박스 검토¶
체크의 사용 unserialize()함수와는 방법을 검토하고 외부 파라미터가 허용됩니다., 사용하여 안전,표준 형식으로 데이터 교환 등의 JSON(viajson_decode()
및json_encode()
)전달해야 하는 경우 직렬화된 데이터를 사용합니다.
Python¶
블랙 검토¶
경우 트래픽 데이터 기호를 포함 dot.
끝에서,그것은 매우 가능성이 있는 데이터가 전송되었 serialization.
WhiteBox Review¶
Python 의 다음 API 는 직렬화 공격에 취약합니다. 아래 패턴에 대한 코드를 검색하십시오.,
- 사용의
pickle/c_pickle/_pickle
load/loads
:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
- 사용하는
PyYAML
load
:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
- 사용하는
jsonpickle
encode
또는store
방법이 있습니다.
Java¶
다음 기술은 모두 Java 의 직렬화 가능 형식에 대한 역 직렬화에 대한 공격을 방지하는 데 적합합니다.,
구현 조언:
- 에서 당신의 코드를 재정의
ObjectInputStream#resolveClass()
방법을 방지하는 임의의 클래스에서는 deserialize. 이 안전한 동작은 SerialKiller 와 같은 라이브러리에 래핑 될 수 있습니다. - 여기에서 볼 수 있듯이 일반
readObject()
메소드에 안전한 대체품을 사용하십시오. 이것은 입력 길이와 직렬화 해제 된 객체 수를 확인하여”10 억 개의 웃음”유형 공격을 해결합니다.
WhiteBox Review¶
잠재적 인 직렬화 취약점에 대해 다음과 같은 Java API 사용을 알고 있어야합니다.,
XMLdecoder
with external user defined parameters
XStream
with fromXML
method (xstream version <= v1.46 is vulnerable to the serialization issue)
ObjectInputStream
with readObject
4.,rns 제안할 수 있습니다 데이터가 전송되었 Java serialization 스
-
AC ED 00 05
에서 육 -
rO0
Base64 -
Content-type
헤더 HTTP 응답을 설정하는application/x-java-serialized-object
데이터 유출을 방지하고 신뢰할 수 있는 필드 건드리지¶
데이터가 있는 경우에는 회원의 개체하지 않아야 하는 제어 최종 사용자에 의해 진행하는 동안 또는 노출하는 사용자가 직렬화하는 동안,그들은 그들로 선언해야 합transient
키워드(섹션에서 중요 정보를 보호하).,
직렬화 가능으로 정의 된 클래스의 경우 민감한 정보 변수는private transient
로 선언되어야합니다.
예를 들어,클래스 계정,변수’이익’과 이익을 선언했으로 일시적인 방지 할 수 있는 직렬화:
public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....
방지 직렬화의 도메인을 개체¶
의 일부 응용 프로그램 개체도록 강요할 수 있습을 구현하는 직렬화로 인해 자신의 계층 구조입니다., 는 것을 보장하는 응용 프로그램 개체할 수 없 deserialize,readObject()
방법을 선언해야(과 함께final
수정)는 항상 발생하는 예외:
강화 자신의 java.io.ObjectInputStream¶
java.io.ObjectInputStream
클래스를 사용하여 직렬화 개체입니다. 그것을 서브 클래 싱함으로써 그 행동을 강화하는 것이 가능합니다., 이는 최상의 솔루션을 경우:
- 을 변경할 수 있는 코드가 진행
- 무엇을 알고 있는 클래스를 기대하는 직렬화
일반적인 아이디어를 재정의ObjectInputStream.html#resolveClass()
기 위해서는 제한하는 클래스는 것이 허용되 deserialize.
기 때문에 이 호출하기 전에는readObject()
이라는 확신할 수 있습 없는 직렬화 활동이 발생하지 않는 한 유형 중 하나입할 수 있습니다.,
간단한 예제는 이와 같이 여기는LookAheadObjectInputStream
클래스를 보장하지 않는 직렬화는 다른 유형은 외Bicycle
등급:
더 완벽한 구현에서는 이 방법의 제안으로 다양한 커뮤니티 구성원:
- NibbleSec-도서관 수 있는 화원의 클래스할 수 있는 병렬화된
- IBM-액 보호,쓰 년 전에 가장 파괴적 착취 시나리오를 구상했다.,
- Apache Commons IO 클래스가
강화는 모든 java.io.ObjectInputStream 사용으로 에이전트¶
위에서 언급한 바와 같이,java.io.ObjectInputStream
클래스를 사용하여 직렬화 개체입니다. 그것을 서브 클래 싱함으로써 그 행동을 강화하는 것이 가능합니다. 그러나지 않으면 자신의 코드 또는 기다릴 수 없습니다 패치를 사용하여,에이전트를 직물 강화를java.io.ObjectInputStream
최상의 솔루션입니다.,
전 세계적으로 변화ObjectInputStream
은 안전을 위한 블랙리스트 알려진 악성 종류기 때문에,그것은 에 대해 알고 가능한 모든 응용 프로그램이 무엇이 예상되는 클래스를 병렬화된다. 다행히도,블랙리스트에 필요한 클래스가 거의 없으며,오늘날 알려진 모든 공격 벡터로부터 안전 할 수 있습니다.
남용 될 수있는 더 많은”가제트”클래스가 발견되는 것은 불가피합니다. 그러나 수정이 필요한 오늘날 노출 된 취약한 소프트웨어의 엄청난 양이 있습니다., 어떤 경우에,”고정”이 취약점이 포함될 수 있습을 재설계하는 메시징 시스템을 깨고 이전 버전 호환성 개발자로서 이동으로 받아들이지 않는 직렬화 개체입니다.
사용하려면 이러한 에이전트,단순히 새로 추가 JVM 매개변수:
-javaagent:name-of-agent.jar
에이전트 이 접근 방식에 의해 발표되었 다양한 커뮤니티 구성원
- rO0 대비하여 보안
비슷한 그러나 더 적은 확장성 접근 것을 수동으로 패치 및 스트랩 귀하의 JVM 의 ObjectInputStream. 이 접근법에 대한 지침은 여기에서 확인할 수 있습니다.
.,Net CSharp¶
화이트 박스 검토¶
검색 소스 코드를 위해 다음과 같은 기간:
TypeNameHandling
JavaScriptTypeResolver
어떤 serializer 형식 설정한 사용자에 의해 통제되는 변수입니다.,
블랙 검토¶
검색에 대한 다음과 같은 base64 인코딩하는 콘텐츠를 시작:
AAEAAAD/////
검색에 대한 내용을 다음과 같이 텍스트:
TypeObject
$type:
일반 주의 사항¶
지 않도록 주의하십시오 데이터 스트림의 종류를 정의하는 개체 스트림이 될 것입니다 deserialize 니다. 하여 이러한 문제를 방지할 수 있습을 사용하여 예를 들어DataContractSerializer
또는XmlSerializer
경우에는 모두 가능합니다.,
여기서JSON.Net
은 사용되고 있는지 확인TypeNameHandling
만 설정을None
.
TypeNameHandling = TypeNameHandling.None
경우JavaScriptSerializer
은 사용되는 다음 그것을 사용하지 않으로JavaScriptTypeResolver
.
자신의 유형을 정의하는 데이터 스트림을 직렬화 해제해야하는 경우 직렬화 해제가 허용되는 유형을 제한하십시오. 하나는 그 자체로 잠재적으로 위험한 많은 네이티브.Net 유형만큼 여전히 위험하다는 것을 알고 있어야합니다. 예:,
System.IO.FileInfo
FileInfo
체 파일을 참조하는 실제로 서버에 있을 때 병렬화된,속성을 변경하고,해당 파일의 예:읽기 전용으로 만들고,잠재적인 서비스 거부 공격이 있습니다.
직렬화 할 수있는 유형을 제한 한 경우에도 일부 유형에는 위험한 속성이 있음을 기억하십시오. System.ComponentModel.DataAnnotations.ValidationException
,예를 들어 있는 속성을Value
의 유형Object
., 이 형식은 형식이 허용되는 직렬화때는 공격자가 설정할 수 있습니다Value
속성을 모든 개체형들을 선택합니다.
공격자가 인스턴스화 될 유형을 조종하지 못하게해야합니다. 이것이 가능한 다음에도DataContractSerializer
또는XmlSerializer
수 있는 전복 e.g.
// Action below is dangerous if the attacker can change the data in the databasevar typename = GetTransactionTypeFromDatabase();var serializer = new DataContractJsonSerializer(Type.GetType(typename));var obj = serializer.ReadObject(ms);
실행 내에서 발생할 수 있습니다.Net 유형 동안 직렬화. 아래에 표시된 것과 같은 컨트롤을 만드는 것은 효과가 없습니다.,
var suspectObject = myBinaryFormatter.Deserialize(untrustedData);//Check below is too late! Execution may have already occurred.if (suspectObject is SomeDangerousObjectType){ //generate warnings and dispose of suspectObject}
한BinaryFormatter
및JSON.Net
가 만들의 안전한 형태 백색 목록이 사용하여 제어 사용자 지정SerializationBinder
.
을 유지하려고 그대로–날짜에 알려져 있습니다.순이 안전하지 않은 직렬화 기기 및 지불하는 특별한주의는 이러한 유형으로 만들 수 있습의 직렬화 프로세스입니다. Deserializer 는 알고있는 유형 만 인스턴스화 할 수 있습니다.잠재적 인 가젯을 만들 수있는 코드를 인터넷 연결이있는 코드와 별도로 유지하려고합니다., 예를 들어 WPF 응용 프로그램에서 사용되는System.Windows.Data.ObjectDataProvider
는 임의의 메서드 호출을 허용하는 알려진 가젯입니다. 신뢰할 수없는 데이터를 직렬화하는 REST 서비스 프로젝트에서이 어셈블리에 대한 참조를 갖는 것은 위험 할 것입니다.
알려진.,NET RCE Gadgets¶
System.Configuration.Install.AssemblyInstaller
System.Activities.Presentation.WorkflowDesigner
System.Windows.ResourceDictionary
System.Windows.Data.ObjectDataProvider
System.Windows.Forms.BindingSource
Microsoft.Exchange.Management.SystemManager.WinForms.ExchangeSettingsProvider
System.Data.DataViewManager, System.Xml.XmlDocument/XmlDataDocument
System.Management.Automation.PSObject
Language-Agnostic Methods for Deserializing Safely¶
Using Alternative Data Formats¶
A great reduction of risk is achieved by avoiding native (de)serialization formats., 로 전환하여 순수한 데이터 형식으로 다음과 같 JSON or XML,당신은 당신의 가능성을 줄이 사용자 지정 진행하고 논리되는 용도 변경으로 악성 종료됩니다.
대부분의 응용 프로그램은 데이터 전송을 개체는 패턴을 만드는 것을 포함한 별도의 개체의 도메인에 대한 명시적 목적의 데이터 전송을 지원합니다. 물론 순수한 데이터 객체가 구문 분석 된 후에도 응용 프로그램이 보안 실수를 범할 가능성은 여전히 있습니다.,
만 직렬화 서명된 데이터¶
경우 응용 프로그램을 알고 있기 전에 진행하는 메시지가 처리할 필요가,그 기호들의 한 부분으로 직렬화 과정입니다. 그런 다음 응용 프로그램은 인증 된 서명이없는 모든 메시지를 직렬화 해제하지 않도록 선택할 수 있습니다.,
Mitigation Tools/Libraries¶
- Java 안전한 직렬화 도서관
- SWAT(Serial Whitelist 응용 프로그램 트레이너)
- NotSoSerial
검색 툴¶
- Java 직렬화 속 장을 목표로 펜 테스터
- 증-개념에 대한 도구를 생성하중을 이용한 안전하지 않은 Java 객체를 직렬화.
- Java De-serialization toolkits
- Java de-serialization tool
- .,n
- JavaSerialKiller
- Java 직렬화 스캐너
- 트 ysoserial
- SuperSerial
- SuperSerial-Active
참조¶
- Java-직렬화-Cheat-Sheet
- 직렬화의 신뢰할 수 없는 데이터를 사용하여
- Java 직렬화를 공격 독일 OWASP 일 2016
- AppSecCali-2015 년 마샬링클
- 디기탈리스의 보안 취약점 발표
- Java 직렬화 속 장을 목표로 펜 테스터
- 증-개념에 대한 도구를 생성하중을 이용한 안전하지 않은 Java 객체를 직렬화.,
- Java De-직렬화하는 툴킷
- Java de-직렬화 도구
- 트림 스위트 확장
- Java 안전한 직렬화 도서관
- Serianalyzer 은 바이트 코드는 정적 해석기를 위한 직렬화
- 탑재량 발전기
- Java 안드로이드 진행하고 취약점을 검사자
- 트림 스위트 확장
- JavaSerialKiller
- Java 직렬화 스캐너
- 트 ysoserial
- SuperSerial
- SuperSerial-Active
- .Net
- 알바 Muñoz:.,NET Serialization:취약한 엔드 포인트 탐지 및 방어
- James Forshaw-Black Hat USA2012-당신은 내 유형입니까? 니다.net 샌드박스를 통해 직렬화
- 요나단이 자작나무 BlueHat v17-위험한 내용을 확보.Net 직렬화
- 알바 Muñoz&올 Mirosh-금요일 13:을 공격하 JSON-AppSecUSA2017