Archie é uma estrutura baseada em QEMU para avaliação de falhas independentes da arquitetura. Ele permite ao usuário definir campanhas de falha usando um arquivo de configuração JSON e executar automaticamente toda a campanha sem entrada adicional do usuário. Archie é capaz de simular falhas permanentes e transitórias em instruções, memória e registros. Os dados comportamentais do destino são coletados e armazenados dentro de um arquivo de log HDF5 para análise posterior.
Para usar este programa Python, o Qemu com o plug -in de falha é necessário (o QEMU pode ser encontrado no Qemu, o plug -in de falha pode ser encontrado na pasta Faultplugin).
Um projeto de exemplo, que injeta falhas em um firmware incorporado Tinyaes, pode ser encontrado unter https://github.com/tibersam/archie-aes-example
[[ TOC ]]
Para o Toolchain Qemu e o plug -in de falha, precisam ser compilados. Isso pode ser feito automaticamente executando o script Build.sh . Certifique -se de que as bibliotecas necessárias para QEMU e as bibliotecas Python para Archie sejam instaladas. Para o Ubuntu, o script de construção pode instalar as dependências ausentes para Qemu e Python. Ele perguntará se deve instalar as dependências.
./build.sh
Como alternativa, as instruções de construção são fornecidas nas seções a seguir.
Archie foi testado com o Qemu 6.0, disponível em Archie-Qemu. Primeiro, verifique se os requisitos básicos para o QEMU estão instalados. Consulte o wiki para as bibliotecas necessárias (https://wiki.qemu.org/hosts/linux). Nos sistemas Ubuntu, você pode instalar os pacotes mínimos necessários com:
sudo apt install git build-essential ninja-build libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
Submodule Git Git qemu, que deve verificar TCG_PLUGIN_DEV do Git. Consulte o segmento de código abaixo.
git submodule update --init
mkdir -p qemu/build/debug
cd qemu/build/debug
./../../configure --target-list=arm-softmmu --enable-debug --enable-plugins --disable-sdl --disable-gtk --disable-curses --disable-vnc
make -j {CPUCORENUMBER}
cd ../../../faultplugin/
make
Com isso, o Archie-Qemu é construído no Qemu/ Build/ Debug/ e o plug-in é construído em Faultplugin/ Se você alterar o diretório de compilação para Archie-Qemu , altere o caminho no Makefile na falha PLUGIN/ PASTER para criar o plug-in.
Para o programa Python3, as seguintes bibliotecas são necessárias
pandas (tested 0.25.3)
tables (tested 3.6.1)
python-prctl (tested 1.6.1)
numpy (tested 1.17.4)
json (tested 2.0.9), or json5 (tested 0.9.6)
Essas bibliotecas Python3 podem ser instaladas usando o método de instalação do seu Linux-Distribution ou usando o PIP3. O JSON5 é fortemente recomendado, pois permite que os números inteiros sejam representados como números hexadecimais.
Para PIP3, os requisitos.txt podem ser usados. Se você estiver usando o PIP3, instale o libcap-dev . É necessário para o python-prctl. Veja também https://pythonhosted.org/python-prctl/#downloading-and-installing
Para usar o programa Python3 (controlador.py), são necessários dois arquivos de configuração. Esses arquivos estão no formato JSON. Consulte https://www.json.org/json-en.html para obter detalhes.
Qemuconf.json contém um objeto com o caminho para o executável QEMU, a biblioteca do plug -in, o BIOS e o kernel que devem ser executados pelo Qemu. Argumentos adicionais que devem ser passados para Qemu podem ser especificados com additional_qemu_args . Consulte "Qemuconf.json" para um arquivo JSON válido com caminhos. Ajuste os caminhos para o seu respectivo sistema. O minoblink da pasta contém uma demonstração binária para experimentação inicial. Para testá -lo, modifique o caminho do kernel para "kernel" : "miniblink/miniblink.bin . Se outra arquitetura deve ser usada, altere a linha "machine" : "stm32f0discovery" , substituindo o STM32F0 Discovery pelo nome associado a Qemu -M ?
falha.json contém a descrição das falhas. Ele contém um objeto que implica o objeto de ponto de partida, o objeto de endpoint, o objeto Memdump e uma matriz de falhas. Por favor, consulte as descrições em falhas-leitura.md para ver como criar esse objeto JSON. Um exemplo de configuração para várias experiências pode ser encontrado em falha.json
A saída do programa será armazenada em um arquivo HDF5. Para uma descrição de como interpretar o conteúdo do arquivo, consulte hdf5-readme.md .
Para executar o programa Python3, tipo:
python3 controller.py --debug --fault fault.json --qemu qemuconf.json output.hdf5
Substitua Fault.json e qemuconf.json pelos arquivos correspondentes.
O sinalizador -debug cria um arquivo de log para cada experimento. O nome do arquivo de log possui o seguinte formato: log_experiment-id.txt , por exemplo, log_4.txt para o experimento com o ID 4.
Para obter mais informações sobre os parâmetros de entrada, digite:
python3 controller.py --help
É possível conectar -se a uma instância QEMU em execução com o GDB. Para usar esse recurso na estrutura e observar falhas introduzidas, o sinalizador - -GDB pode ser definido. Archie iniciará o processo QEMU interno com o GDB ativado e interromperá na inicialização do sistema simulado. Para conectar -se ao qemu a partir do GDB, use a porta 1234. Ele também forçará a estrutura a gerar apenas um trabalhador e passará por todas as falhas configuradas em falhas.json . Se for necessária uma falha específica, o arquivo JSON precisará ser editado para conter apenas essa falha específica.
python3 controller.py --gdb --fault fault.json --qemu qemuconf.json output.hdf5
Para conectar -se do GDB ao uso da sessão qemu
targ rem:localhost:1234
Qemu aguardará unil a sessão do GDB está anexada. O modo de depuração é adequado apenas para a análise de um baixo número de falhas. Passar por uma grande quantidade de falhas é complicado. Isso deve ser considerado ao ajustar os arquivos JSON.