Questão Como posso intencionalmente quebrar / corromper um setor em um cartão SD?


Eu preciso testar a resiliência de algum código de leitura / gravação para algum hardware embutido. Como posso sacrificar alguns cartões SD e quebrar vários setores conhecidos para um estudo controlado?

A única coisa em que consigo pensar é sobrescrever um único setor alguns milhões de vezes. Gostaria de saber se um script de badblocks do Linux pode ser criado para executar seu teste destrutivo em um único setor repetidamente por várias horas.


137


origem


Você pode mudar o driver SD de baixo nível para fingir que há um bloco ruim, ou isso está fora de questão? - Mark Yisri
@MarkYisri, eu não acho que o motorista é muito acessível. Seja qual for o driver que estamos usando é ultra-rudimentar para maximizar a alocação de memória para o resto do firmware. Além disso, se fosse possível, isso provavelmente estaria além da minha capacidade. - Gabe Krause
Você pode criar um emulador de cartão SD? Não é o projeto mais simples, lembre-se. - user20574
Dado o objetivo, você poderia comprar alguns cartões SD de segunda mão por pouco dinheiro e você pode facilmente obter um defeituoso, ou colocar um anúncio "procurando por ..." especificamente para procurar cartões defeituosos. Ou pesquise no eBay por cartões defeituosos. Então você testa o cartão e você saberá a posição das áreas defeituosas. - FarO
Pergunte a qualquer fotógrafo profissional. Eles vão ter uma pilha de cartões SD, certamente. - J...


Respostas:


Uma abordagem alternativa que pode seja útil.

Se o seu código é executado no Linux, então talvez você possa testá-lo com um dispositivo lógico "defeituoso". dmsetup pode criar dispositivos que retornam erros de E / S. Basta construir o seu dispositivo usando error e / ou flakey alvo. A partir de man 8 dmsetup:

error
  Erros qualquer E / S que vai para esta área. Útil para testes ou para criar dispositivos com buracos.

flakey
  Cria um mapeamento semelhante para o linear alvo, mas exibe comportamento não confiável periodicamente. Útil para simular dispositivos com falha durante o teste.

Nota: flakey o uso de destino é documentado Aqui. Exemplo básico Aqui.

Até onde eu sei, um erro de I / O será reportado imediatamente, então isso é diferente do comportamento real do cartão SD onde você pode esperar atrasos, paradas etc. No entanto, eu acho que essa abordagem pode ser útil em alguns casos, pelo menos teste preliminar ou assim.


167



Eu aprecio esse pensamento out-of-box! Estamos interagindo no nível de bloco com o SD através de um chip Atmel de 80MHz e nenhum sistema operacional real. - Gabe Krause
@ GabeKrause Nesse caso, a utilidade dessa resposta depende da similaridade da API do dispositivo de bloqueio do Linux com a API do driver de dispositivo incorporado. - Qsigma
dmsetup comando para configurar um error dispositivo que sempre retorna erros de leitura: stackoverflow.com/questions/1870696/… - Peter Cordes
Eu concordo que isso soa como uma solução melhor. Primeiro você pode replicar em qualquer hardware. E também você pode simular os diferentes modos de erro. Por exemplo, eu tenho uma unidade flash USB de 16GB que funciona bem. Depois de algum tempo, uma determinada área começa a retornar dados errados. Não há nenhum erro FS de qualquer tipo. Você leu o arquivo, mas o conteúdo é diferente. Alguns setores são obviamente instáveis. Mas como um determinado dispositivo se comportará não pode ser conhecido antecipadamente. - akostadinov


Esse cara hackeou o microcontrolador dentro de cartões SD usados ​​para marcar blocos ruins: https://www.bunniestudios.com/blog/?p=3554

Você pode fazer o mesmo e arbitrariamente marcar blocos como defeituosos.

Hoje no Chaos Computer Congress (30C3), xobs e eu divulgamos um   achando que alguns cartões SD contêm vulnerabilidades que permitem   execução de código arbitrário - no próprio cartão de memória. No escuro   lado, a execução de código no cartão de memória permite uma classe de MITM   (man-in-the-middle) ataques, onde o cartão parece estar se comportando um   maneira, mas na verdade faz outra coisa. No lado da luz, também   permite a possibilidade de os entusiastas de hardware obterem acesso a   fonte muito barata e onipresente de microcontroladores.

.

Esses algoritmos são muito complicados e específicos para serem executados   na aplicação ou no nível do sistema operacional, e assim acontece que cada flash   disco de memória vem com um microcontrolador razoavelmente poderoso para executar um   conjunto personalizado de algoritmos de abstração de disco. Até mesmo o diminuto microSD   cartão contém não um, mas pelo menos dois chips - um controlador, e em   menos um chip flash (cartões de alta densidade empilharão vários flashes   morrer).

.

O microcontrolador embutido é tipicamente um 8051 fortemente modificado ou   CPU ARM. Em implementações modernas, o microcontrolador abordará   Níveis de desempenho de 100 MHz, e também tem vários   aceleradores on-die. Surpreendentemente, o custo de adicionar esses controladores   para o dispositivo é provavelmente da ordem de US $ 0,15 a US $ 0,30, particularmente   para empresas que podem fabular a memória flash e os controladores   dentro da mesma unidade de negócios. Provavelmente é mais barato adicionar esses   microcontroladores do que testar exaustivamente e caracterizar cada flash   chip de memória, o que explica por que os dispositivos flash gerenciados podem ser mais baratos   por bit do que os chips flash brutos, apesar da inclusão de um   microcontrolador.

.

O ponto crucial é que o mecanismo de carregamento e atualização de firmware é virtualmente   obrigatório, especialmente para controladores de terceiros. Usuários finais são   raramente exposta a este processo, uma vez que tudo acontece na fábrica,   mas isso não torna o mecanismo menos real. Nas minhas explorações   dos mercados de eletrônicos na China, eu vi compradores de loja queimando   firmware em cartões que “expandem” a capacidade do cartão - em outros   palavras, eles carregam um firmware que relata a capacidade de um cartão é   muito maior do que o armazenamento disponível real. O fato de que isso é   possível no ponto de venda significa que, muito provavelmente, a atualização   mecanismo não está protegido.

Em nossa palestra em 30C3, relatamos nossas descobertas explorando uma determinada   marca microcontroladora, nomeadamente, a Appotech e a sua AX211 e AX215   ofertas. Nós descobrimos uma simples sequência de “batidas” transmitida   comandos reservados pelo fabricante (ou seja, CMD63 seguido de   "A", "P", "P", "O") que deixam o controlador em um carregamento de firmware   modo. Neste ponto, a placa aceitará os próximos 512 bytes e será executada   como código.


75



De todas as respostas, esta é provavelmente a mais próxima do que o OP realmente estava pedindo. - Cort Ammon
Essa foi uma leitura fantástica! - Gabe Krause
@Twisty copiou algumas das partes relevantes. - FarO
Abaixo o buraco do coelho no mundo da arquitetura de cartão SD eu vou. - Tejas Kale


Isso normalmente não funciona porque os cartões SD mais recentes (ou eMMC) usam nivelamento de desgaste estático e dinâmico, o que significa que um controlador inteligente interpreta sua instrução de gravação e a mapeia para um dos setores de flash menos usados.

A única coisa que você pode fazer é tentar entrar em contato com seus fornecedores e pedir sua folha de dados; pode haver algumas maneiras (específicas do fornecedor) de recuperar o estado de seu algoritmo de nivelamento de desgaste. Isso potencialmente permitiria consultar o estado / uso do flash subjacente. Ou você pode ser azarado e isso pode não existir.

Se o seu objetivo é realmente destruir o flash, tudo o que você pode fazer é executar ciclos maciços de leitura e gravação e verificar continuamente se os dados que você está lendo ainda estão consistentes. Por exemplo. crie dois arquivos grandes, armazene seus checksums e os leia / escreva para verificar sua soma de verificação. Quanto maior o flash, mais demorado será esse processo.


38



Isso ainda não funcionará se o cartão SD estiver completamente preenchido com dados, de modo que não seja possível remapear muito? Eu não acho que eles tenham muitos setores escondidos. - Ruslan
@Ruslan O dispositivo não precisa saber se um setor está preenchido com alguma coisa. Só precisa saber o conteúdo de quais setores entregar a pedido e quais setores escrever a pedido. E então pode haver alguma camada de abstração no lugar, fazendo com que ela use outra memória física para representar esses setores seguindo algum algoritmo não divulgado ... - E "full" significa apenas "limite atingido para blocos preenchíveis atualmente", é claro. - Alexander Kosubek
@Ruslan: Mesmo que o dispositivo inteiro tenha dados, o nivelamento de desgaste ainda pode ser efetivo: por exemplo, se o setor A foi escrito uma vez e o setor B foi escrito 1.000 vezes, quando outra gravação chegar sector B o cartão pode trocar os dados para os dois sectores, para que o sector A contenha os dados do sector B (e provavelmente será substituído mais vezes - mas tudo bem, porque é recente), e o sector B conterá dados do sector A (que espero que não mude muito). Obviamente, o dispositivo também precisa armazenar o mapeamento de qual setor é armazenado onde. - psmears
@ GabeKrause sim, essa é a natureza da fera. No nível mais baixo você tem chips nand ou nem flash (hoje em dia tudo está usando nand), e há um controlador inteligente na frente do chip nand que termina o barramento (por exemplo, usb para um stick USB ou mmc para um cartão SD ), e este chip é responsável pelo mapeamento / desgaste, etc, abstrai o flash de você. Se você usasse o nand no Linux embutido, isso é o que, por exemplo, o ubifs faria por você. - amo-ej1
Os cartões SD têm um microcontrolador que implementa uma "Camada de Tradução Flash" - os pedidos de bloco são traduzidos por este microcontrolador para comandos NAND brutos. Alguns cartões SD têm comandos ocultos para alterar / atualizar o firmware do MCU e até mesmo alguns esforços de engenharia reversa são feitos nele. A maioria dos dispositivos de armazenamento flash além do NAND bruto (que pode aparecer em alguns casos como muitos roteadores domésticos) provavelmente está superprovisionada - o que significa que seu cartão SD de 1GB provavelmente tem algo como 1024MB + 128MB de espaço NAND bruto para cobrir o nivelamento de desgaste quando estiver cheio e também poupando setor para páginas flash ruins. - LawrenceC


Você pode aumentar o desgaste do transistor aumentando a temperatura de operação. Use ciclos de escrita em um chip aquecido (70-120 ° C); vai se desgastar mais rápido.


32



Temperatura de armazenamento excessiva também é prejudicial, por isso, pode ser mais prático "cozinhar" o chip a 120 ° C (ou até mais) por algum tempo, depois verificar se há defeitos. - Dmitry Grigoryev
Uma ligeira sobretensão no suprimento para o cartão também pode ser possível, e seria similarmente necessário experimentar. - Chris H
Subtensão também pode causar diferentes tipos de defeitos, como travamentos do controlador. - user20574


Prefácio: Esta opção requer programação adicional e modificações de hardware, mas permitiria leituras controladas mais provavelmente transparentes para o host.

Um cartão SD tem várias opções de E / S, mas pode ser controlado pela SPI. Se você pegasse um cartão SD e o modificasse para que pudesse conectar os pinos a um microcontrolador (como um Arduino), você poderia fazer com que o Arduino imitasse o cartão SD e fosse transparente para o dispositivo que estivesse lendo o cartão SD. Seu código no microcontrolador pode propositadamente retornar dados ruins quando necessário. Além disso, você poderia colocar um cartão SD no microcontrolador para que as leituras pudessem passar pelo microcontrolador para o cartão SD para permitir gigabytes de teste.


18



A maioria dos dispositivos de alta velocidade (incluindo leitores de cartão de PC) simplesmente se recusam a trabalhar com um cartão que não suporta SD de quatro bits. - Dmitry Grigoryev
O OP disse que era um sistema embarcado que usaria o cartão, o que tornaria mais provável o suporte a SPI para cartões SD. - Eric Johnson
Uma variante disso, mas um trabalho mais difícil, seria encontrar um cartão SD para o qual você pode reflash o firmware. - Peter Taylor
Isso é super interessante! Nosso sistema embarcado está executando E / S por meio do SPI. Não tenho certeza se tenho a largura de banda para modificar nosso hardware para realizar uma adição como essa, mas acho que é um pensamento brilhante. - Gabe Krause
Ficar educado sobre o desgaste dinâmico me leva a acreditar que criar estrategicamente um cartão SD "ruim" com setores defeituosos conhecidos é muito mais difícil (ou não é possível) do que eu esperava ao fazer a pergunta. Embora atualmente fora do escopo da minha habilidade, esta parece ser a abordagem mais controlável e tecnicamente promissora, seguida possivelmente pelo @Olafm. A personalização de hardware intermediário para interceptar e "corromper" dados em qualquer local do setor pré-definido durante a transferência de dados parece ser uma boa abordagem. - Gabe Krause


Gostaria de ir ao ebay / aliexpress e comprar o cartão SD mais barato que eu posso encontrar na China, o que é "bom demais para ser verdade". Eles geralmente vêm com setores defeituosos ou estão em um conjunto de software muito maior do que realmente são. De qualquer forma, você deve acabar com o cartão SD com defeito para usar para testes.


15



Abordagem interessante, mas como você escreveria nas áreas ruins para testar os efeitos dos blocos ruins no código armazenado? - fixer1234
@ fixer1234, eu tinha um desses cartões SD que dizia ser de 32GB, mas na verdade eram apenas 128MB. Eu coloquei na minha câmera e pude tirar fotos além dos 128MB, mas apenas as primeiras fotos puderam ser lidas de volta. O resto foi listado, mas foi lido como quebrado. Acho que é assim que eles querem que você perceba os problemas com o cartão primeiro, quando é tarde demais para reclamar ... - GuzZzt


Era uma vez, muitos anos atrás, eu era pago para recuperar um conjunto de fotos de formatura e vídeos de um cartão SD para uma mãe um pouco perturbada. Após uma inspeção cuidadosa, o cartão tinha sido fisicamente danificado com uma rachadura visível no gabinete externo e tinha vários setores defeituosos, principalmente vários setores iniciais e críticos, o que fez com que até mesmo os programas de recuperação mais confiáveis ​​no momento não conseguissem ler o cartão. . Além disso, ferramentas de dados forenses naquela época custam uma fortuna.

Acabei obtendo um cartão SD de marca / tamanho idêntico e escrevendo meu próprio utilitário de despejo e restauração de dados brutos personalizado para copiar os dados do cartão ruim para o cartão bom. Toda vez que o utilitário atinge um setor defeituoso, ele tenta novamente várias vezes antes de escrever todos os zeros para esse setor e, em vez de desistir e parar, ignora a falha e passa para o próximo setor. As tentativas de repetição foram feitas, pois também notei que alguns setores ainda tinham uma taxa de sucesso de leitura de 40%. Uma vez que os dados estavam no novo cartão SD, as ferramentas de recuperação que falharam antes funcionaram perfeitamente com o mínimo de perda / corrupção de dados. No geral, cerca de 98% de todos os arquivos foram recuperados. Vários itens que haviam sido excluídos anteriormente também foram recuperados porque nada é realmente excluído - apenas marcado como tal e substituído de forma lenta. O que começou como um exercício de recuperação de dados ligeiramente entediante tornou-se um dos meus projetos de desenvolvimento de software pessoal mais memoráveis ​​e interessantes. Caso você esteja se perguntando, a mãe ficou emocionada.

De qualquer forma, esta história mostra que é possível danificar fisicamente um cartão SD de forma que os dados ainda estejam acessíveis, mas os setores que mal funcionam e que qualquer tentativa de leitura tenha dificuldades em fazê-lo. Plástico de cartão SD tende a ser bastante frágil, então dobrar ou cortar alguns mais baratos pode fazer o truque. Sua milhagem pode variar.

Você também pode perguntar em alguns locais de recuperação de dados em sua área. Como eles são especializados em recuperação de dados de vários dispositivos com falha ou falha, eles devem ter algumas entradas / dicas úteis e podem até ter alguns cartões SD pré-eliminados disponíveis (por exemplo, para fins de treinamento) que você poderia obter deles.


11



Você liberou esse utilitário on-line? Isso seria ótimo para adicionar ao meu arsenal. - Ploni
Nesse ponto, provavelmente nem funcionaria adequadamente, dada a marcha do progresso da tecnologia (pode até não ser compilada) e as chamadas de sistema de baixo nível que usei. Há também algumas ferramentas modernas de clonagem de dispositivos / drives forenses de código aberto que eu estaria mais apto a usar em primeiro lugar do que tentar extrair meu antigo software de naftalina. - CubicleSoft
Eu espero que você provavelmente possa apenas dar alguns parâmetros para dd fazer com que ele se comporte de maneira semelhante a isso, hoje em dia. Eu não tenho certeza embora. - wizzwizz4
@ wizzwizz4, olhe para ddrescue. - hildred
"Além disso, ferramentas de dados forenses na época custam uma fortuna." Tenho certeza que eles ainda fazem. - jpmc26


Esta resposta é uma expansão no comentário do @Ruslan

  1. Preencha o seu cartão SD até cerca de 99,9%
  2. Continuamente reescreva o conteúdo dos 0,1% restantes (Escreva A -delete-escreva B-delete - Escreva A ...)
  3. Teste (periodicamente) se você já quebrou o cartão

Alternativa possível:

Não tenho certeza se isso funciona para seus propósitos, mas talvez seja suficiente danificar fisicamente o seu cartão, o que pode ser muito mais rápido.


5



Preencher o cartão para 99% não ajudará, já que todo o propósito do nivelamento de desgaste é evitar exatamente esse tipo de dano prematuro. Danificar fisicamente a placa quase certamente resultará em uma placa que não inicializa mais. - Dmitry Grigoryev
@DmitryGrigoryev Como usar o nivelamento será de muita ajuda (impedimento, neste caso) a menos que o cartão tenha Muito de mais memória do que sua capacidade oficial? - ispiro
@ ispiro Por exemplo, da próxima vez que um setor com alta contagem de gravações é sobrescrito, seu conteúdo pode ser trocado por um setor com uma baixa contagem de gravação. - Dmitry Grigoryev
@DmitryGrigoryev Se eu interpretar esta resposta corretamente, deve haver cartões SD que não usam lvling: electronics.stackexchange.com/a/27626/16104 - Dennis Jaheruddin
@DennisJaheruddin Sim, cartão mais antigo não faz isso. com esses cartões, basta criar / remover repetidamente um arquivo vazio até que o setor na tabela de alocação se acabe. - Dmitry Grigoryev


Você poderia tentar introduzir uma fonte de alimentação instável ou uma sinalização de tensão mais alta.

Uma falha comum para uma família de dispositivos que eu conheço tem uma forte correlação entre a corrupção do cartão SD e o contato intermitente da bateria.


3





Alguns cartões SD mais antigos e de baixa capacidade (16MB-ish) usam chips flash em pacotes estilo TSOP / TSSOP. Um workshop capaz de retrabalho SMT (se você estiver fazendo trabalho incorporado, você pode ter essa habilidade em casa, caso contrário, verifique se as pequenas empresas que fazem reparo de telefone / laptop no nível da placa) poderiam separar e recolocar esse chip, para que ele possa ser lido e escrito em bruto (incluindo os códigos ECC) com um programador de dispositivos.

Ainda assim, esteja ciente de que você estará testando principalmente:

  • Como o seu dispositivo lidará com possíveis aberrações / interrupções de tempo introduzidas pela correção interna de erros

e no pior dos casos

  • como o seu dispositivo lida com um cartão SD com falha terminal.

Se você quiser apenas verificar como ele se comporta com comportamento errático por qualquer motivo a partir de um cartão SD, provavelmente é melhor apenas introduzir ruído elétrico nas linhas da interface (por exemplo, colocando um comutador de barramento FET no meio e em momentos aleatórios momentaneamente alternando para uma fonte de sinais sem sentido (dos níveis elétricos certos).


3



Os cartões SD com falha terminal não geram "ruído elétrico", apenas retornam códigos de erro para operações de gravação. - Dmitry Grigoryev