AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1029337
Accepted
Hao
Hao
Asked: 2018-04-29 09:46:51 +0800 CST2018-04-29 09:46:51 +0800 CST 2018-04-29 09:46:51 +0800 CST

Como posso corrigir um libc.so.6 ausente/renomeado?

  • 772

A razão pela qual eu preciso de alguma forma me tornar root sem digitar sudoé porque

error while loading shared libraries: libc.so.6: 
    cannot open shared object file: No such file or directory

eu costumava sudotersudo mv /lib64/libc.so.6 /lib64/libc.so.6.bak

Porque segui algumas instruções para poder atualizar o link simbólico para libc-12.4.soem vez do atual libc-12.2.sopor

LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6

Mas isso não funciona usando sudo. Agora estou com medo de sair ou reiniciar para a morte do sistema. Porque preciso obter permissão de root para corrigir isso.

Eu não tenho um disco de recuperação. na pior das hipóteses, tenho que montar o disco rígido em outra máquina e consertá-lo.

Por favor ajude.

$ sudo bash -c "LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6"
sudo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

$ LD_PRELOAD=./libc-2.14.so sudo LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6
sudo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

$ LD_PRELOAD=./libc-2.12.so sudo LD_PRELOAD=./libc-2.12.so ln -s ./libc-2.12.so ./libc.so.6
sudo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

$ LD_PRELOAD=./libc-2.12.so ln -s ./libc-2.12.so ./libc.so.6
ln: creating symbolic link `./libc.so.6': Permission denied
command-line sudo glibc
  • 3 3 respostas
  • 16640 Views

3 respostas

  • Voted
  1. Best Answer
    Eliah Kagan
    2018-04-29T11:05:53+08:002018-04-29T11:05:53+08:00

    Você deve apenas inicializar a partir de um USB ao vivo (ou CD/DVD) e renomear libc.so.6de volta.

    LD_PRELOADnão funciona com executáveis ​​setuid. Mas, se quiser, você pode usar /bin/busyboxpara fazer backups de última hora (que não requerem a execução de comandos como root) antes de reiniciar. É possível corrigir isso sem um USB/CD/DVD ao vivo, mas você ainda precisará reiniciar e sugiro usar um.


    LD_PRELOADnão funciona com comandos setuid.

    No momento, você está tentando sudousar a biblioteca compartilhada renomeada definindo LD_PRELOAD. Isso não vai funcionar. Você não pode alterar os sudolinks das bibliotecas compartilhadas com LD_PRELOAD, e isso também não funciona com nenhuma das alternativas sudo. Se você pudesse fazer isso, seria um bug de segurança extremamente grave.

    A maneira sudoe pkexec(e su) funcionam para permitir que você eleve privilégios é que esses executáveis ​​têm o bit setuid definido como 0 , o que faz com que sejam executados como o usuário que os possui, que para esses executáveis ​​é o usuário root, em vez do usuário que realmente os executa. Quando eles correm, eles validam com muito cuidado o que você está pedindo para eles fazerem. Dessa forma, desde que seus desenvolvedores tenham sido cuidadosos o suficiente, eles permitirão apenas que os usuários executem ações para as quais estão autorizados.

    LD_PRELOADnão tem efeito para executáveis ​​setuid executados por usuários que não sejam seus proprietários . Isso é absolutamente vital para a segurança. Caso contrário, qualquer um poderia criar sua própria biblioteca e forçar um programasudoa usá-la, e então qualquer um poderia obter privilégios de root. Você pode usarLD_PRELOADpara executar programas não setuid, e o root pode usá-lo para executar praticamente qualquer coisa. Mas como um usuário não root, você não pode usá-lo para executar programas comosudo,pkexec, esuque são setuid root.

    Se você já tinha um shell root em execução, não precisaria reiniciar. Mas mesmo se você tiver a conta root habilitada - ou seja, mesmo se você tiver uma senha definida para que possa usar para fazer login como root com um comando como -- você suainda não seria capaz de corrigir o problema sem reiniciar . Por exemplo su, no Ubuntu também requer libc.so.6e também é root setuid, portanto LD_PRELOADtambém não funcionará com ele. 1 (Veja também os comentários de Peter Cordes .)

    O problema aqui é que os mecanismos disponíveis para executar ações como root exigem que você execute executáveis ​​setuid pertencentes ao root como você mesmo, mas LD_PRELOADnão tem efeito nessa situação. Se não fosse pela necessidade de executar ações como root - ou se você já tivesse um shell de root aberto - você seria capaz de renomeá-lo facilmente sem reinicializar e também sem usar LD_PRELOAD. Isso ocorre porque os sistemas Ubuntu têm /bin/busybox, que é vinculado estaticamente. Ele permite que você execute muitas das ferramentas * nix comuns , incluindo os comandos mve . cpVocê pode executar ou executar apenas para obter um shell no qual poderá executar os comandos. Corre/bin/busybox mv source destination/bin/busybox sh/bin/busyboxsem argumentos para obter uma lista de comandos suportados. Tem até uma versão de dpkg!

    Você pode fazer backup de arquivos (se desejar) e reiniciar em um ambiente ativo.

    Menciono busyboxprincipalmente porque, embora você não possa usá-lo para obter privilégios de root e restaurar arquivos libc.so.6, você pode usá-lo para fazer backup de quaisquer arquivos que esteja preocupado em perder antes de reiniciar em um ambiente ativo. Duvido muito que você perca alguma coisa , mas já que está preocupado, você pode usar busyboxpara copiar quaisquer arquivos importantes - como documentos que você criou ou modificou desde seu último backup - para outro local.

    A reinicialização da maneira usual pode não ir muito longe, porque os desligamentos normais na verdade envolvem a execução de programas vinculados dinamicamente que dependem do libc.so.6. Você pode querer usar Alt++SysRqREISUB para reiniciar com segurança . Esta não é uma maneira ideal de desligar, mas provavelmente é melhor do que uma tentativa quase ineficaz de reinicialização seguida de uma reinicialização total. Outra opção seria tentar reiniciar e, em seguida, tentar usar o método REISUB para fazer o resto do caminho. (Se quiser desligar a máquina em vez de reiniciá-la, use REISU O em vez de REISU B .)

    Quando você inicializa a partir de um ambiente ativo, renomear o arquivo será fácil. Você não precisa chrootfazer nada extravagante. Basta montar seu sistema de arquivos raiz (o que geralmente você pode fazer com um clique no navegador de arquivos, embora possa usar o mountcomando, se desejar). Em seguida, em um terminal, use o comando mvou para restaurar . Você precisará de , mas isso funciona bem em um ambiente ao vivo.cplibc.so.6sudo

    Eu sei que você mencionou que não tem um disco de recuperação. Seria difícil, talvez impossível, criar um live USB inicializável naquele sistema, onde você não pode executar a maioria dos programas. (Você pode usar busyboxpara copiar e mover arquivos, e ainda tem um ddcomando, mas eu não recomendaria tentar usá-lo para isso. Normalmente, você precisaria ser capaz de executar ddcomo root para criar mídia ao vivo.) Talvez alguém o faça. sugerir um caminho. Se você tiver outra máquina para colocar o disco rígido, espero que possa criá-lo com essa máquina. Caso contrário, sua melhor aposta pode ser pedir a um conhecido para fazer um.

    Existe uma maneira sem um CD/DVD/USB ao vivo, mas você ainda deve reiniciar.

    No entanto, existe uma alternativa para inicializar a partir de uma mídia externa. 2 Você ainda terá que reiniciar, mas não precisa de um sistema ativo. Eu não recomendo isso especialmente, pois é complicado; usar um ambiente ao vivo é mais fácil. Você pode fazer isso sem um, se realmente quiser.

    Como Zanna havia apontado anteriormente nos comentários, o modo de recuperação não funcionaria porque a maioria dos programas precisa libc.6.so(por exemplo, /bin/bash, que fornece o shell, precisa dele). Mas você pode inicializar o sistema /bin/busybox shcomo init passando init=/bin/busybox shcomo opção de inicialização para o kernel no GRUB. 3 Esta é essencialmente a mesma técnica que a mais comum init=/bin/sh(ou init=/bin/bash) para obter um shell root, mas com /bin/busybox shem vez do regular /bin/sh, porque /bin/shé vinculado dinamicamente e requer libc.so.6.

    Se você quiser fazer dessa maneira, mantenha pressionada a Shifttecla esquerda enquanto (re)inicializa para que o menu de inicialização do GRUB apareça. (Se Shiftnão funcionar, use Esc.) Com as teclas de seta, selecione Opções avançadas para Ubuntu e pressione Enter. Após esse ponto, você não pressionará Enterporque isso inicializaria normalmente, em vez de com opções de inicialização personalizadas. Selecione qualquer kernel e pressione epara editar suas opções de inicialização temporariamente. Se houver várias linhas e seu cursor não estiver na linha que começa com linux, mova-o para lá com as teclas de seta. Adicione init=/bin/busybox shao final dessa linha e pressione F10para inicializá-lo.

    Você deve obter um prompt de shell do BusyBox. Você terá que remontar o readwrite do sistema de arquivos raiz e renomeá libc.so.6-lo para que tenha o nome correto que costumava ter. Para conseguir isso, execute estes comandos no shell BusyBox (onde outros leitores que tenham libc.so.6em um local diferente teriam que ajustar o nome do diretório passado para o cdcomando):

    mount -o remount,rw /
    cd /lib64
    mv libc.so.6.bak libc.so.6
    

    Em seguida, recomendo que você sincronize todas as gravações em cache com o sistema de arquivos, remonte-o somente leitura e reinicie:

    sync
    mount -o remount,ro /
    reboot -f
    

    (Sem -f, o rebootcomando não funciona nessa situação, pois nenhum daemon init adequado está em execução.)


    0 Para aqueles que estão interessados: quando esses programas (como sudo) realmente executam seu comando ou criam um shell como root ou algum outro usuário alternativo, seus IDs de usuário reais e efetivos são definidos como os do usuário de destino. Mas quando você os executa, antes que eles façam isso, enquanto eles determinam se devem permitir que você execute a ação que você solicitou, seu ID de usuário efetivo é o de root, enquanto o ID de usuário real ainda é seu. Menciono isso para abordar um equívoco comum sobre a maneira como os IDs de usuário reais e eficazes funcionam em programas como sudo; se você nunca ouviu falar de IDs de usuário reais e eficazes, sinta-se à vontade para ignorar esta nota de rodapé.

    1 Como mencionado, busyboxno Ubuntu está vinculado estaticamente e não depende de arquivos libc.so.6. Você pode pensar que poderia usar isso para evitar a reinicialização, porque busyboxoferece um sucomando. No entanto, isso não ajuda em nada, porque como ele é instalado, busyboxnão é root setuid. Para realmente permitir que um usuário não root se torne root, su deve ser setuid root. A função útil de busybox sué permitir que o root represente outros usuários, em vez de permitir que outros usuários representem o root.

    2 Zanna contribuiu muito com esse procedimento e também fez todos os testes para ele!

    3 Isso é bem-sucedido ao passar shpara busybox, embora você espere que seja interpretado como uma opção de inicialização do kernel subsequente. Incluir aspas impede que funcione. Observe também que, no Ubuntu, o busyboxexecutável vinculado estaticamente é chamado apenas de busybox, não busybox-static (embora o pacote que o fornece seja chamado de busybox-static). Se você desinstalou o BusyBox vinculado estaticamente e instalou o BusyBox vinculado dinamicamente, esse método não funcionará, mas é muito improvável que você tenha feito isso.

    • 8
  2. Peter Cordes
    2018-05-02T00:52:59+08:002018-05-02T00:52:59+08:00

    Eu sei a senha do root, então deve haver uma maneira de me permitir abrir um shell de root, mas parece que não consigo.

    Você não pode usar a senha root porque (ao renomear libc) você quebrou todas as formas "normais" de usá-la, incluindo o login em gettyoutro console de texto. Se você tivesse um su ou sudo vinculado estaticamente , poderia usá-lo para executar busybox mvou (no caso geral de obter um shell raiz funcional), use

    LD_PRELOAD=whatever LD_LIBRARY_PATH=whatever static-su --preserve-environmentpara passar este ambiente personalizado para um bash rodando como root

    Os próprios binários setuid não podem confiar no ambiente fornecido por um usuário que os executa, mas (se funcionarem) podem transmitir o ambiente se você solicitar isso e souber a senha correta para autenticar essa operação.

    Mas como você não tem um binário setuid estático que possa autenticar sua solicitação para passar um ambiente personalizado para um processo em execução comoroot , você deve apenas usar seu acesso físico para reinicializar em um ambiente que permite modificar o FS raiz. por exemplo, um DVD ou stick USB, ou inicialize seu sistema regular com init=/bin/busybox sh(consulte a resposta de @Eliah).

    Se você não tiver mídia de recuperação, crie algo inicializável em outro computador, usando uma imagem ao vivo do Ubuntu ou uma das várias imagens de inicialização de recuperação adequadas para reparar vários sistemas operacionais e executar diagnósticos de hardware ( aqui está uma análise de 5 diferentes uns ). (Eles geralmente são menores que um Ubuntu ativo, por exemplo, ocupando apenas cerca de 700 MB em um pendrive.)

    Você pode configurar um stick USB para ser inicializável com um desses (ou Ubuntu) enquanto ainda pode usá-lo para armazenamento normal de arquivos; você não precisa dedicar um stick USB inteiro a uma imagem inicializável. (No entanto, as maneiras mais simples de criar um stick USB ao vivo irão destruir o conteúdo anterior e, às vezes, até mesmo não deixá-lo utilizável para armazenar arquivos.)


    Outra opção é fazer com que o initramfs caia em um shell antes de fazer pivot_roote executar o init=que você passou na linha de comando do kernel. Isso não depende de nenhum conteúdo do próprio FS raiz. Você pode não ter um editor, mas tem um catredirecionamento, assim como mv e ln. ( cat > /mnt/root/etc/something). Se o problema que você precisa corrigir não for trivial, você provavelmente deve inicializar algo mais poderoso!

    Isso acontece automaticamente em alguns casos de falha de inicialização, por exemplo, se a detecção de RAID falhar ou algo assim, o root fs não é montado em primeiro lugar (mesmo somente leitura). ( Ubuntu 15.10 - "BusyBox built-in shell (initramfs)" em cada inicialização )

    Você pode fazer isso acontecer break=bottomna linha de comando do kernel para cair no shell do busybox no initramfs, depois de fazer a maioria das coisas (carregar módulos e montar o FS raiz somente leitura), mas antes de executar o arquivoinit. break=premountpára mais cedo; veja esse link ou/usr/share/initramfs-tools/initpara mais detalhes.

    • 4
  3. Sosu Alfred
    2020-08-11T12:02:07+08:002020-08-11T12:02:07+08:00

    Resolvi esse problema no elementary OS, criando uma unidade inicializável contendo a versão do elementary OS que eu tinha e, em seguida, inicializando-a ao vivo.

    Depois de inicializar o liveusb, copiei a pasta /lib para a pasta /lib do sistema operacional elementar com defeito e mesclei mantendo os arquivos recentes.

    Isso funcionou para mim. Espero que seja para você também.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve