Introdução¶
Este artigo está focado em fornecer claro, acionáveis orientação segura anular a serialização de dados não confiáveis em seus aplicativos.
What is Deserialization¶
Serialization is the process of turning some object into a data format that can be restored later. As pessoas muitas vezes serializam objetos a fim de salvá-los para armazenamento, ou para enviar como parte das comunicações.,
Deserialização é o reverso desse processo, tomando dados estruturados a partir de algum formato, e reconstruindo-o em um objeto. Hoje, o formato de dados mais popular para serialização de dados é JSON. Antes disso, era XML.
no entanto, muitas linguagens de programação oferecem uma capacidade nativa para serializar objetos. Estes formatos nativos geralmente oferecem mais recursos do que JSON ou XML, incluindo personalização do processo de serialização.
infelizmente, as características destes mecanismos de deserialização nativa podem ser reutilizadas para efeitos maliciosos ao operar em dados não confiáveis., Ataques contra desertores foram encontrados para permitir ataques de negação de Serviço, controle de acesso e execução de código remoto (RCE).
orientação sobre a Deserialização de objetos de forma segura¶
a seguinte orientação específica da linguagem tenta enumerar metodologias seguras para a deserialização de dados que não podem ser confiáveis.
PHP¶
WhiteBox Review¶
Check the use of unserialize () function and review how the external parameters are accepted., Use um formato de intercâmbio de dados seguro e padrão, como o JSON (via json_decode()
e json_encode()
) se você precisar passar dados serializados para o usuário.
Python¶
BlackBox Review¶
If the traffic data contains the symbol dot .
at the end, it’s very likely that the data was sent in serialization.
WhiteBox Review¶
The following API in Python will be vulnerable to serialization attack. Código de busca para o padrão abaixo.,
- Os usos de
pickle/c_pickle/_pickle
comload/loads
:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
- Usos de
PyYAML
comload
:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
- Usos de
jsonpickle
comencode
oustore
métodos.
Java¶
as seguintes técnicas são todas boas para prevenir ataques contra a deserialização contra o formato serializável de Java.,
conselhos de implementação:
- no seu código, sobreponha o
ObjectInputStream#resolveClass()
método para evitar que classes arbitrárias sejam desertificadas. Este comportamento seguro pode ser embrulhado em uma biblioteca como SerialKiller. - Use um substituto seguro para o genérico
readObject()
método como visto aqui. Note que isso aborda ataques do tipo “bilhão de gargalhadas” verificando o comprimento de entrada e o número de objetos deserializados.
WhiteBox Review¶
Be aware of the following Java API uses for potential serialization vulnerability.,
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 podem sugerir que os dados foram enviados na serialização de Java fluxos
-
AC ED 00 05
no Hex -
rO0
em Base64 -
Content-type
cabeçalho de resposta HTTP definido paraapplication/x-java-serialized-object
Evitar o Vazamento de Dados e Confiáveis Campo Clobbering¶
Se existem membros de dados de um objeto que nunca deve ser controlado por usuários finais durante a desserialização ou expostos para os usuários durante a serialização, eles devem ser declarados como o transient
palavra-chave (seção de Proteger Informações Confidenciais).,
para uma classe definida como serializável, a variável informação sensível deve ser declarada como private transient
.
Por exemplo, a classe myAccount, a variável ‘lucro’ e ‘margem’ foram declaradas como transitório, para evitar ser serializado:
public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....
Evitar a anulação da Serialização de Objetos de Domínio¶
Alguns de seus objetos de aplicativo pode ser forçado a implementar Serializable, devido à sua hierarquia., Para garantir que seu aplicativo objetos não podem ser desserializado, uma readObject()
método deve ser declarada (com um final
modificador), que sempre lança uma exceção:
Endurecer o Seu Próprio java.io.ObjectInputStream¶
java.io.ObjectInputStream
classe é usada para anular a serialização de objetos. É possível endurecer o seu comportamento subclassificando-o., Esta é a melhor solução se:
- Você pode alterar o código que faz a desserialização
- Você saber que classes que você espera para desserializar
A ideia geral é a de substituir ObjectInputStream.html#resolveClass()
para restringir quais classes podem ser desserializado.
porque esta chamada acontece antes de um id
ser chamado, você pode ter certeza de que nenhuma atividade de deserialização ocorrerá a menos que o tipo seja aquele que você deseja permitir.,
Um simples exemplo mostrado aqui, onde o LookAheadObjectInputStream
classe é a garantia de não anular a serialização de qualquer outro tipo, além de Bicycle
categoria:
Mais completa implementações desta abordagem tem sido proposto por vários membros da comunidade:
- NibbleSec – uma biblioteca que permite que as listas brancas e listas negras de classes que podem ser desserializado
- IBM – seminal de proteção, escrito anos antes de mais devastadoras da exploração de cenários foram pensados.,
- Apache Commons IO classes
Harden All java.io.ObjectInputStream Usage with an Agent¶
As mentioned above, the java.io.ObjectInputStream
class is used to deserialize objects. É possível endurecer o seu comportamento subclassificando-o. No entanto, se você não possui o código ou não pode esperar por um patch, usando um agente para tecer em endurecimento para java.io.ObjectInputStream
é a melhor solução.,
a mudança global de ObjectInputStream
só é segura para tipos maliciosos conhecidos na lista negra, porque não é possível saber para todas as aplicações quais são as classes esperadas a serem deserializadas. Felizmente, há muito poucas classes necessárias na lista negra para estarem a salvo de todos os vectores de ataque conhecidos, hoje.
é inevitável que mais classes” gadget ” serão descobertas que podem ser abusadas. No entanto, há uma quantidade incrível de software vulnerável exposto hoje, na necessidade de uma correção., Em alguns casos,” corrigir ” a vulnerabilidade pode envolver re-arquitetar sistemas de mensagens e quebrar a compatibilidade de trás para a frente à medida que os desenvolvedores se movem para não aceitar objetos serializados.
Para ativar esses agentes, basta adicionar uma nova JVM parâmetro:
-javaagent:name-of-agent.jar
Agentes de tomar esta abordagem tem sido divulgado por vários membros da comunidade:
- rO0 pelo Contraste de Segurança
Um semelhante, mas menos escalável abordagem seria o patch manualmente e bootstrap sua JVM do ObjectInputStream. Estão aqui disponíveis orientações sobre esta abordagem.
.,Net CSharp¶
WhiteBox Revisão¶
Procure o código-fonte para os termos a seguir:
TypeNameHandling
JavaScriptTypeResolver
Olhar para qualquer serializadores onde o tipo é definido por uma variável controlada pelo usuário.,
BlackBox Revisão¶
Procurar o seguinte conteúdo codificado em base64 que começa com:
AAEAAAD/////
Procurar o conteúdo com o seguinte texto:
TypeObject
$type:
Precauções Gerais¶
não permitir que o datastream para definir o tipo de objeto que o fluxo vai ser para anular a serialização. Você pode evitar isso, por exemplo, usando o DataContractSerializer
ou XmlSerializer
se possível.,
Where JSON.Net
is being used make sure theTypeNameHandling
is only set toNone
.
TypeNameHandling = TypeNameHandling.None
Se JavaScriptSerializer
não o utilize com um JavaScriptTypeResolver
.
Se você precisa deserializar fluxos de dados que definem seu próprio tipo, em seguida, restringir os tipos que são autorizados a ser deserializados. Deve-se estar ciente de que isso ainda é arriscado como muitos tipos nativos.Net potencialmente perigosos em si mesmos. como.,
System.IO.FileInfo
FileInfo
objetos que fazem referência a arquivos, na verdade, o servidor pode, quando desserializado, alterar as propriedades desses arquivos e.g. para só de leitura, a criação de um potencial ataque de negação de serviço.
mesmo que tenha limitado os tipos que podem ser desertificados lembre-se que alguns tipos têm propriedades que são arriscadas. , for example has a property Value
of typeObject
., se este tipo é o tipo permitido para a deserialização, então um atacante pode definir o Value
propriedade para qualquer tipo de objeto que escolher.
atacantes devem ser impedidos de dirigir o tipo que será instanciado. Se isso é possível, então, mesmo DataContractSerializer
ou XmlSerializer
pode ser subvertido 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);
Execução pode ocorrer dentro de certos .Tipos de rede durante a desserialização. Criar um controle como o mostrado abaixo é ineficaz.,
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
e JSON.Net
é possível criar um seguro de formulário de lista branca do controlo utilizando um personalizado SerializationBinder
.
tente manter-se atualizado sobre os dispositivos de deserialização inseguros conhecidos.Net e preste atenção especial onde tais tipos podem ser criados por seus processos de deserialização. Um desertor só pode instanciar tipos que conhece.
tente manter qualquer código que possa criar gadgets potenciais separados de qualquer código que tenha conectividade à internet., Como exemplo System.Windows.Data.ObjectDataProvider
usado em aplicações WPF é um gadget conhecido que permite a invocação arbitrária de métodos. Seria arriscado ter esta referência a esta Assembleia num projecto de serviço de repouso que desertifique dados não confiáveis.
conhecido .,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., Ao mudar para um formato de dados puro como JSON ou XML, você diminui a chance de a lógica de deserialização personalizada ser reaproveitada para fins maliciosos.
muitas aplicações dependem de um padrão de objeto de transferência de dados que envolve a criação de um domínio separado de objetos para a transferência de dados propósito explícito. É claro que ainda é possível que a aplicação cometa erros de segurança depois de um objeto de dados puro ser analisado.,
apenas Deserializar dados assinados¶
Se a aplicação sabe antes da deserialização quais mensagens terão de ser processadas, eles poderiam assiná-los como parte do processo de serialização. A aplicação poderia então escolher não deserializar qualquer mensagem que não tivesse uma assinatura autenticada.,
Ferramentas de Mitigação/Bibliotecas¶
- Java seguro anulação da biblioteca
- SWAT (Série Branca Aplicativo Treinador)
- NotSoSerial
Ferramentas de Detecção¶
- Java desserialização cheat sheet destinadas a caneta testadores
- Uma prova de conceito de ferramenta para a geração de cargas que exploram inseguro objeto Java desserialização.
- Java des-serialization toolkits
- Java des-serialization tool
- .,n
- JavaSerialKiller
- Java Desserialização Scanner
- Arroto-ysoserial
- SuperSerial
- SuperSerial-Activo
Referências¶
- Java-Anulação-Cheat-Folha
- a anulação da Serialização de dados não confiáveis
- Java Desserialização Ataques – alemão OWASP Dia 2016
- AppSecCali 2015 – Empacotamento Picles
- FoxGlove de Segurança – Vulnerabilidade Anúncio
- Java desserialização cheat sheet destinadas a caneta testadores
- Uma prova de conceito de ferramenta para a geração de cargas que exploram inseguro objeto Java desserialização.,
- Java De-serialização de kits de ferramentas
- Java de-serialização ferramenta
- Burp Suite extensão
- Java seguro anulação da biblioteca
- Serianalyzer é estático bytecode analyzer para desserialização
- Carga do gerador
- Android Java Desserialização Vulnerabilidade Testador
- Burp Suite Extensão
- JavaSerialKiller
- Java Desserialização Scanner
- Arroto-ysoserial
- SuperSerial
- SuperSerial-Activo
- .Net
- Álvaro Muñoz: .,Net Serialization: Detecting and defending vulnerable endpoints
- James Forshaw – Black Hat USA 2012-Are You My Type? Quebrando .net caixas de areia Através de Serialização
- Jonathan Bétula BlueHat v17 – Conteúdo Perigoso – Protegendo .Net Desserialização
- Álvaro Muñoz & Oleksandr Mirosh – sexta-feira 13: Atacar JSON – AppSecUSA 2017