Meu sistema Linux suporta a tabela syscall de 32 bits?

2

O contexto é o seguinte:

Additionally, the following rule is required in systems supporting the 32-bit syscall table (such as i686 and x86_64).

Estou tentando descobrir o que isso significa e como posso verificar se meu sistema precisa dessa regra. Eles fazem referência aos comandos chown e chown32 / (syscalls, talvez) e continuam discutindo a arquitetura do sistema em torno dele. Eu só me importo com o Linux, mas eu não me importo apenas com o x86.

Na saída de lscpu , você tem o campo CPU op-mode , que se parece com:

CPU op-mode(s):        32-bit, 64-bit

para um processador x86_64 com suporte para arquitetura dupla. Eu presumo que mostraria 32 ou 64 apenas em sistemas que não são capazes de interpretar as instruções do outro.

Meu dilema é descobrir isso programaticamente (eu eventualmente escreverei como Python) em um sistema legado sem lscpu nele. Eu examinei esta questão onde eles falam sobre como encontrar compatibilidade de 64 bits, mas estou com dificuldades para usar esses recursos no caso de uso oposto.

Então, para resumir por que isso é um problema até agora:

  • lscpu não é a máquina
    • Eu corri sudo find / -iregex .*lscpu.* para ter certeza
  • /proc/cpuinfo explica a compatibilidade de 64 bits por meio de sinalizadores terminando em _lm (compatibilidade de não 32 bits, até onde eu saiba)
  • uname é insuficiente: exibe a arquitetura principal e, embora seja seguro assumir x86_64 , sem dúvida, suporta 32 bits também, mapear arquiteturas conhecidas para compatibilidade não parece ser a maneira mais confiável ou eficiente de resolver esse problema específico
  • hwinfo não está na máquina
  • getconf LONG_BIT verifica a compatibilidade de 64 bits
  • lshw não está na máquina

É possível que eu tenha esquecido algo e igualmente possível eu não entendo o suficiente sobre o assunto como programador. Alguém poderia me ajudar a entender como programaticamente - ou seja, algum método de obter uma saída exata ou analisável - verificar se o meu sistema tem compatibilidade de 32 bits?

    
por Josh Detwiler 17.07.2018 / 21:10

1 resposta

3

Suponho que você esteja seguindo o Guia de implementação técnica de segurança do RHEL 5 .

“O meu sistema Linux suporta a tabela syscall de 32 bits?” é uma questão muito interessante e, como Gilles menciona, não uma que tenha sido abordada de forma conclusiva no site. Também é uma pergunta difícil de responder.

Vou começar reduzindo-o para o contexto STIG, ie “Meu sistema Linux suporta a tabela syscall do i386?” (Nós revisitaremos o problema mais geral depois). Você não pode obter uma lista definitiva de syscalls suportados de um kernel em execução , mas neste caso não precisamos: tudo o que precisamos fazer é procurar pelos pontos de entrada do syscall. Os pontos de entrada do i386 são convenientemente denominados: as funções visíveis externamente usadas pelas chamadas nativas de 32 bits e pela camada de emulação de 64 a 32 bits são do_fast_syscall_32 e do_int80_syscall_32 . A melhor maneira de verificar isso é procurá-los em /proc/kallsyms (espero que não haja outra regra STIG que proíba isso ...). Se eles estiverem presentes, o kernel atual suporta chamadas do sistema i386 e você precisa da regra de auditoria lchown32 .

Ao ler as outras respostas sobre esse tipo de tópico, você verá que uma forma típica de testar o suporte a chamadas do sistema em um sistema em execução é tentar fazer a chamada do sistema. Ao auditar um sistema que pode não ser apropriado, ele deve acionar uma regra de auditoria. Ele também pode resultar em falsos negativos durante a auditoria, já que normalmente se baseia tanto no kernel que suporta a chamada de sistema relevante quanto no sistema que fornece a estrutura necessária.

Usar os resultados de lscpu e outras ferramentas semelhantes também é enganoso, pois eles relatam os recursos da CPU instalada, não os do sistema. Por exemplo, lscpu de equivalências de códigos rígidos: lm , zarch ou sun4[uv] nos sinalizadores de CPU informam que há suporte a 32 e 64 bits, o que é da perspectiva da CPU, mas lscpu não determina se o resto do sistema também suporta (nem deveria).

Revisitando a questão mais geral, “Meu sistema Linux suporta a tabela syscall de 32 bits?”, determinar a resposta sempre dependerá da arquitetura. Se tentarmos examinar as chamadas do sistema para determinar a resposta, precisamos levar em conta o histórico de chamadas do sistema na arquitetura; Por exemplo, chown32 e irmãos não são necessariamente suportados em arquiteturas de 32 bits. Da mesma forma, procurar pontos de entrada depende da arquitetura.

Assim, não acho que haja uma resposta geral para sua pergunta; as respostas devem levar em conta pelo menos a arquitetura de destino.

    
por 18.07.2018 / 10:26