quinta-feira, 24 de setembro de 2026

ClamAV no Linux



   Leia todo o artigo antes de sair executando comandos e siga os comandos na sequência apresentada no artigo, a não ser que você saiba o que está fazendo.

   O presente artigo, além de instalar e configurar o ClamAV, apresenta fins didáticos para aprendizagem.

   É um artigo explicativo para fins de entendimento do ClamAV, sendo que foi testado várias vezes para o que se pretende no artigo.

   Talvez alguém dirá: "para quê um anti-vírus no Linux?"; porém, existe vírus para Linux, mas como o Linux não é amplamente utilizado como desktop ninguém faz vírus para Linux, além disso, agora com o advento de IA faz-se necessário alguma proteção extra no desktop e, principalmente, em servidores.


   ClamAV é um kit de ferramentas antivírus de código aberto (GPLv2) projetado especialmente para verificação de e-mail em servidores de e-mail. Ele fornece vários utilitários incluindo um daemon multiencadeado flexível e escalável, um scanner de linha de comando e uma ferramenta avançada para atualizações automáticas de banco de dados. O núcleo do pacote é um mecanismo antivírus disponível na forma de biblioteca compartilhada.

   O ClamAV® é um poderoso mecanismo antivírus de código aberto para detecção de trojans, vírus, malware e outras ameaças maliciosas. O ClamAV não possui um modo de "verificação rápida". O ClamAV é um conjunto de ferramentas de detecção de malware, não é um antivírus tradicional nem um pacote de segurança para endpoints.

   Cabe a você decidir o que verificar. Uma verificação completa do sistema levará muito tempo com o ClamAV ou com qualquer outro software antivírus.

   Clamscan, ClamOnAcc e Clamdscan incluem as opções "--remove" para excluir qualquer arquivo que gere alertas durante uma verificação. Isso geralmente é uma péssima ideia, a menos que você esteja monitorando um diretório de uploads/downloads. Falsos positivos acontecem! Você não quer que o arquivo errado seja excluído acidentalmente. Em vez disso, considere usar o parâmetro "--move" ou talvez apenas "--copy" e configure um script com o recurso "VirusEvent" para notificá-lo quando algo for detectado.

   O ClamAV inclui uma ferramenta de filtragem de e-mails chamada clamav-milter. Essa ferramenta interage diretamente com o Clamd, e, portanto, requer uma instância Clamd em funcionamento para ser executada. No entanto, os arquivos de configuração e de log do clamav-milter são separados dos do Clamd.

AVISO
   O ClamAV vem minimamente configurado, você deve configurá-lo manualmente de acordo com o teu cenário e as tuas necessidades. Caso você seja daquelas almas sebosas e fedorentas que gostam de dizer: "capaz que vou passar todo esse trabalho para configurar um programa", pare de ler aqui esse artigo e vá bater a cabeça na parede ou vá enfiar a cara no ventilador repetidas vezes ou vá fazer sei lá o que você gosta de fazer, mas, claramente, teu lugar não é aqui.

   No final tem um resumo com os comandos e pouca explicação.

   O ClamAV é fornecido pela Cisco Systems, Inc.

Documentação:


   A distribuição utilizada de exemplo foi o Void, porém, você pode adaptar para a tua distribuição sem grandes mudanças.

   O ClamAV está presente nos repositórios de quase todas as distribuições.

   Vários comandos utilizados são universais para quase todas as distribuições.


Instalação para Fedora, AlmaLinux, openSUSE, etc:


Instalação para Debian, Ubuntu, Mint, etc:


Para instalar a partir dos fontes:



Verificando a configuração do Kernel

Verificando a configuração do Kernel para a presença do fanotify:

cat /boot/config-`uname -r` | grep FANOTIFY
Caso tiver habilitado no Kernel a saída será essa:
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y

E se isso aparecer:
CONFIG_FANOTIFY=y
# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set

então está habilitado, mas a verificação de acesso será restrita ao modo somente notificação, ou seja, vai avisar que tem vírus, mas fará absolutamente nada.

   Caso aparecer CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set o fanotify não está habilitado no seu Kernel então você deverá recompilar o Kernel para habilitá-lo ou instalar um Kernel mais moderno, mas não será mostrado aqui pois demanda tempo e não é o escopo do artigo.

   Dificilmente dará CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set porque CONFIG_FANOTIFY=y passou a vir habilitado por padrão na arquitetura x86 na versão Kernel Linux 2.6.37 e CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y passou a vir ativada por padrão no defconfig genérico do x86 na versão Kernel Linux 3.14.

   Não será modificada a configuração do arquivo clamav-milter.conf, deixaremos com as configurações padrões. O ClamAV-Milter é o aplicativo do ClamAV que fornece filtragem de e-mails, caso a máquina Linux não for servidor de e-mails não se faz necessário. Para Desktop não precisa instalar, mas vai do seu gosto.


Instalação


Atualizando e instalando (adapte para a tua distribuição):
sudo xbps-install -Syu
sudo xbps-install clamav
Name Action Version New version Download size
clamav install - 1.5.3_1 40MB
Size to download: 40MB
Size required on disk: 182MB
Space available on disk: 5405MB

Do you want to continue? [Y/n] Y

[*] Downloading packages
clamav-1.5.3_1.x86_64.xbps.sig2: 512B [avg rate: 14MB/s]
clamav-1.5.3_1.x86_64.xbps: 40MB [avg rate: 9318KB/s]
clamav-1.5.3_1: verifying RSA signature...

[*] Collecting package files
clamav-1.5.3_1: collecting files...

[*] Unpacking packages
clamav-1.5.3_1: unpacking ...

[*] Configuring unpacked packages
clamav-1.5.3_1: configuring ...
Created _clamav system group.
Created _clamav system user.
clamav-1.5.3_1: installed successfully.

1 downloaded, 1 installed, 0 updated, 1 configured, 0 removed, 0 on hold.


Os arquivos serão criados no diretório /etc:
/etc/freshclam.conf
/etc/clamd.conf
/etc/clamav-milter.conf.sample
Obs.: Em algumas distribuições ficarão no caminho /etc/clamav, verifique o caminho certo.

Sugestão de pesquisa:
sudo find / | grep freshclam.conf
Caso já tenha os arquivos de uma instalação anterior e não quis removê-los para resguardar as configurações, a instalação preserva os arquivos e cria novos com a seguinte nomenclatura:
/etc/freshclam.conf.new-1.5.3_1
/etc/clamd.conf.new-1.5.3_1
/etc/clamav-milter.conf.sample
Caso queira, pode removê-los.

Verifique se o usuário e o grupo do ClamAV foram criados:

cut -d: -f1 /etc/passwd
cut -d: -f1 /etc/group
   Caso não tenha sido criado na tua distribuição, crie o usuário (no Void, ao instalar o ClamAV, o usuário e o grupo _clamav são criados automaticamente, então pode pular esses dois comandos):
sudo groupadd _clamav
sudo useradd -g _clamav -s /bin/false -c "Clam Antivirus" _clamav
Se o seu sistema operacional não tiver os utilitários groupadd e useradd, instale-os.

Vamos remover a extensão do arquivo:
cd /etc
sudo mv clamav-milter.conf.sample clamav-milter.conf
cd
Caso precisar, aqui tem o freshclam.conf oficial:

https://github.com/Cisco-Talos/clamav/blob/main/etc/freshclam.conf.sample


   Criando diretório para o soquete local e permissionando (verifique o nome correto de usuário):
sudo mkdir -p /var/run/clamav
Por padronização é sem o sublinhado em /var/run/clamav.
sudo chown -R _clamav:_clamav /var/run/clamav
sudo chmod -R 750 /var/run/clamav


Arquivos de Log


Para o Freshclam:
sudo touch /var/log/freshclam.log
sudo chown _clamav:_clamav /var/log/freshclam.log
sudo chmod 640 /var/log/freshclam.log

Para o Clamd:
sudo touch /var/log/clamd.log
sudo chown _clamav:_clamav /var/log/clamd.log
sudo chmod 640 /var/log/clamd.log
Colocando o diretório database com o dono correto (verifique se é _clamav ou clamav):
sudo chown -R _clamav:_clamav /var/lib/_clamav


   O ClamAV Daemon, ou Clamd, é um daemon multithread que utiliza a libclamav para verificar arquivos em busca de vírus. O ClamAV fornece diversas ferramentas que interagem com esse daemon.

   São elas:
  1. Clamdscan - um cliente de digitalização simples;
  2. Clamonacc - fornece varredura em tempo real (também conhecida como proteção em tempo real por meio de uma instância Clamd);
  3. Clamav-milter - um plugin de filtragem de e-mails para o software de servidor de processamento de e-mails Sendmail, que permite analisar e-mails;
  4. Clamdtop - uma interface de monitoramento de recursos para o Clamd.

   O ClamAV também fornece uma ferramenta de linha de comando para tarefas simples de varredura com a libclamav, chamada Clamscan. Ao contrário do daemon Clamd, o Clamscan não é um processo persistente e é mais adequado para casos de uso em que uma varredura única com configuração mínima é necessária.

   As ferramentas mais complexas fornecidas pelo ClamAV exigem algum grau de configuração. O ClamAV fornece três arquivos com configurações de exemplo:

🔵clamd.conf: para configurar o comportamento do ClamAV Daemon Clamd e ferramentas associadas;
🟢freshclam.conf: para configurar o comportamento da ferramenta de atualização do banco de dados de assinaturas;
🟡clamav-milter.conf: para configurar o comportamento do ClamAV de filtragem de e-mails para servidor de e-mails, que interage diretamente com o Clamd.

   Além disso, uma ferramenta chamada clamconf permite que os usuários verifiquem as configurações usadas por cada uma das outras ferramentas, obtendo informações dos arquivos de configuração listados acima, juntamente com outras informações relevantes.
clamconf
Clamconf mostra todas as configurações:
clamconf --help
man clamconf
man clamd
man clamonacc
man clamscan
man clamdscan
   Dependendo do método de instalação e do sistema operacional, algumas opções de configuração podem já ter sido pré-configuradas. No Void os arquivos de configurações vêm todos comentados, à exceção da linha User no arquivo clamd.conf.

   No entanto, dependendo da distribuição, é provável que você precise criar novos arquivos de configurações ou modificar os existentes com configurações personalizadas que façam mais sentido para o seu caso de uso.

   A título de curiosidade, uma instalação a partir do código-fonte exigirá que você crie um arquivo freshclam.conf antes de usar o Freshclam, crie um arquivo "clamd.conf" antes de usar o Clamd e um arquivo "clamav-milter.conf" antes de usar o ClamAV-Milter.

   Os arquivos freshclam.conf, clamd.conf e o clamav-milter.conf são os arquivos principais de configurações do ClamAV antivírus.

   O parâmetro "DatabaseDirectory /var/lib/_clamav" deve ser o mesmo nos arquivos freshclam.conf e clamd.conf. Caso alterar em um, deve, obrigatoriamente, alterar no outro. Aconselho a deixar no padrão.

   Em algumas distribuições é /var/lib/clamav, sem o sublinhado.


AVISO
   "Os espelhos e links se reservam o direito de bloquear seu IP caso você abusar dos downloads e atualizações muitas vezes por hora ou abusar do servidor de qualquer maneira."

   Faça atualizações dos bancos de dados e assinaturas com sensatez.

   A ferramenta Freshclam é a usada para baixar e atualizar os bancos de dados oficiais de assinaturas de vírus do ClamAV.

   Obs.: Em sistemas onde tem o SELinux ativado, provavelmente você precisará definir o contexto SELinux correto, caso contrário, o serviço Freshclam não conseguirá acessar o arquivo.

   A seguir deixo os conteúdos dos arquivos freshclam.conf e clamd.conf, ambos em estado funcional e com espelhos (mirrors) para bancos de dados de vírus e pragas em geral.

   Freshclam é a ferramenta de atualização automática do banco de dados do Clam AntiVirus.
   Ela pode ser configurada para funcionar em dois modos:
    • interativo - sob demanda a partir da linha de comando;
    • daemon - silenciosamente em segundo plano.
Aqui faremos interativo através do Cron.


FRESHCLAM.CONF

Uso o vim, use teu editor preferido.
sudo vim /etc/freshclam.conf
Comente ou remova a linha ~8:
# Comment or remove the line below.
# Example ... <<< Linha 8

   Vá descomentando e configurando os parâmetros abaixo (ou deixe tudo comentado e acrescente no final).

Obs.: Na linha 92 comente "DatabaseMirror database.clamav.net", pois já está abaixo.
DatabaseDirectory /var/lib/_clamavUpdateLogFile /var/log/freshclam.logLogFileMaxSize 0LogRotate noLogTime yesLogVerbose yesDatabaseOwner _clamavDNSDatabaseInfo current.cvd.clamav.netMaxAttempts 5NotifyClamd /etc/clamd.confReceiveTimeout 300
# Check for new database 2 times a dayChecks 2DatabaseMirror database.clamav.net#DatabaseMirror db.br.clamav.netDatabaseMirror db.ar.clamav.netDatabaseMirror db.at.clamav.netDatabaseMirror db.au.clamav.netDatabaseMirror db.be.clamav.netDatabaseMirror db.bg.clamav.netDatabaseMirror db.ca.clamav.netDatabaseMirror db.ch.clamav.netDatabaseMirror db.cn.clamav.netDatabaseMirror db.cz.clamav.netDatabaseMirror db.de.clamav.netDatabaseMirror db.dk.clamav.netDatabaseMirror db.ec.clamav.netDatabaseMirror db.ee.clamav.netDatabaseMirror db.es.clamav.netDatabaseMirror db.fr.clamav.netDatabaseMirror db.gr.clamav.netDatabaseMirror db.hk.clamav.netDatabaseMirror db.hu.clamav.netDatabaseMirror db.id.clamav.netDatabaseMirror db.ie.clamav.netDatabaseMirror db.it.clamav.netDatabaseMirror db.jp.clamav.netDatabaseMirror db.kr.clamav.netDatabaseMirror db.lt.clamav.netDatabaseMirror db.mx.clamav.netDatabaseMirror db.nl.clamav.netDatabaseMirror db.pl.clamav.netDatabaseMirror db.pt.clamav.netDatabaseMirror db.ro.clamav.netDatabaseMirror db.ru.clamav.netDatabaseMirror db.se.clamav.netDatabaseMirror db.sg.clamav.netDatabaseMirror db.sk.clamav.netDatabaseMirror db.tr.clamav.netDatabaseMirror db.tw.clamav.netDatabaseMirror db.ua.clamav.netDatabaseMirror db.uk.clamav.netDatabaseMirror db.us.clamav.net## ArgentinaDatabaseMirror clamav.md5.com.ar## AustraliaDatabaseMirror clamav.island.net.auDatabaseMirror clamav.mirror.pacific.net.auDatabaseMirror clamavdb.planetmirror.com## AustriaDatabaseMirror clamav.inode.atDatabaseMirror xarch.clamav.net## BelgiumDatabaseMirror clamav.edpnet.net## BulgariaDatabaseMirror clamav.host.bgDatabaseMirror clamav.paralax.org## CanadaDatabaseMirror clamav.mirror.rafal.caDatabaseMirror clamav.gossamer-threads.com## ChinaDatabaseMirror clamav.ialfa.net## Czech RrepublicDatabaseMirror clamav.iol.czDatabaseMirror clamav.skynet.czDatabaseMirror clamav.mirror.vutbr.cz## DenmarkDatabaseMirror clamav.dif.dkDatabaseMirror clamav.mirrors.webpartner.dk## EcuadorDatabaseMirror clamav.ecualinux.com## EstoniaDatabaseMirror clamav.infonet.ee## FranceDatabaseMirror clamav.easynet.frDatabaseMirror clamav.inet6.frDatabaseMirror clamav.univ-nantes.frDatabaseMirror clamav.ovh.netDatabaseMirror clamav.mirror.waycom.net## GermanyDatabaseMirror clamav.mirror.fizzelpark.comDatabaseMirror clamav.informatik.fh-furtwangen.deDatabaseMirror clamav.lug-norderstedt.deDatabaseMirror clamav.mcs.deDatabaseMirror clamav.mirror.myebs.deDatabaseMirror clamav.pcn.deDatabaseMirror clamav.power-netz.deDatabaseMirror clamav.savework.deDatabaseMirror fuxhausen.tiscali.deDatabaseMirror clamav.ftpproxy.orgDatabaseMirror clamav.kgt.org## GreeceDatabaseMirror clamav.forthnet.grDatabaseMirror clamav.uoc.gr## Hong KongDatabaseMirror clamav.meiwing.comDatabaseMirror clamavdb.hostlink.com.hkDatabaseMirror clamav.cpss.edu.hk## HungaryDatabaseMirror clamav.crysys.huDatabaseMirror clamav.dc.huDatabaseMirror clamav.fisher.huDatabaseMirror clamavdb.ikk.sztaki.hu## IndonesiaDatabaseMirror clamav.cbn.net.idDatabaseMirror db.clamav.or.id## IrelandDatabaseMirror clamavdb.heanet.ie## ItalyDatabaseMirror clamav.oltrelinux.comDatabaseMirror clamav.mirror.garr.itDatabaseMirror clamav.linux.itDatabaseMirror idea.sec.dico.unimi.it## JapanDatabaseMirror clamav.nara.wide.ad.jpDatabaseMirror clamav-mirror.wiseknot.co.jpDatabaseMirror clamavdb.ml-club.jpDatabaseMirror clamav.mtcnet.jpDatabaseMirror clamav.begi.netDatabaseMirror clamavdb.osj.netDatabaseMirror clamav.s-lines.netDatabaseMirror clamav.yukiguni.netDatabaseMirror clamavdb.mithril-linux.org#Republic of KoreaDatabaseMirror clamav.hanbiro.com## LithuaniaDatabaseMirror clamav.vtu.lt## MexicoDatabaseMirror clamav.mpsnet.com.mx## NetherlandsDatabaseMirror clamav.essentkabel.comDatabaseMirror clamav.fx-services.comDatabaseMirror clamav.prolocation.netDatabaseMirror clamav.mirror.transip.nlDatabaseMirror clamav.unnet.nlDatabaseMirror clamav.xs4all.nlDatabaseMirror clamav.packetstorm.nu## PolandDatabaseMirror database.clamav.ps.pl## PortugalDatabaseMirror clamav.linux.pt#v# RomaniaDatabaseMirror clamav.iasi.roedu.net## Russian FederationDatabaseMirror clamav.citrin.ruDatabaseMirror clamav.eastweb.ruDatabaseMirror clamav.unix.su## SingaporeDatabaseMirror clamav.acnova.com## SlovakiaDatabaseMirror clamav.hq.alert.sk## SpainDatabaseMirror clamav.talika.eii.us.es## SwedenDatabaseMirror clamav.kratern.seDatabaseMirror clamav.df.lth.seDatabaseMirror clamav.mainloop.se## SwitzerlandDatabaseMirror switch.clamav.net## TaiwanDatabaseMirror clamav.cs.pu.edu.twDatabaseMirror clamav.stu.edu.tw## TurkeyDatabaseMirror clamav.enderunix.orgDatabaseMirror clamav.ubak.gov.tr## UkraineDatabaseMirror clamav.intercom.net.ua## United KingdomDatabaseMirror clamav.mirror.camelnetwork.comDatabaseMirror clamav.dbplc.comDatabaseMirror clamav.spod.orgDatabaseMirror clamav.public-internet.co.uk## United StatesDatabaseMirror clamav.catt.comDatabaseMirror clamav.clearfield.comDatabaseMirror clamav.devolution.comDatabaseMirror clamav.edebris.comDatabaseMirror clamav.edgescape.comDatabaseMirror clamav.infotex.comDatabaseMirror clamav.irontec.comDatabaseMirror clamav.liquidweb.comDatabaseMirror clamav.pathlink.comDatabaseMirror avmirror2.prod.rxgsys.comDatabaseMirror clamav.theshell.comDatabaseMirror clamav-du.viaverio.comDatabaseMirror clamav-sj.viaverio.comDatabaseMirror clamav.walkertek.comDatabaseMirror clamav.westlinks.comDatabaseMirror clamav.xyxx.comDatabaseMirror clamav.pinna.cxDatabaseMirror clamav.unet.brandeis.eduDatabaseMirror clamav.bridgeband.netDatabaseMirror clamav.inoc.netDatabaseMirror clamav-000.mirrors.nks.netDatabaseMirror clamav-001.mirrors.nks.netDatabaseMirror clamav-002.mirrors.nks.netDatabaseMirror clamav-003.mirrors.nks.netDatabaseMirror clamav-004.mirrors.nks.netDatabaseMirror clamav-005.mirrors.nks.netDatabaseMirror clamav.oc1.mirrors.redwire.netDatabaseMirror clamav.securityminded.netDatabaseMirror clamav.securitywonks.netDatabaseMirror clamav.sonic.net## MalwareDatabaseCustomURL https://cdn.malware.expert/malware.expert.ndbDatabaseCustomURL https://cdn.malware.expert/malware.expert.hdbDatabaseCustomURL https://cdn.malware.expert/malware.expert.ldbDatabaseCustomURL https://cdn.malware.expert/malware.expert.fp## Sanesecurity: malware, spam, phishing, lottery, etcDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/sigwhitelist.ign2DatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/sanesecurity.ftmDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/MiscreantPunch099-INFO-Low.ldbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/MiscreantPunch099-Low.ldbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/Sanesecurity_BlackEnergy.yaraDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/Sanesecurity_sigtest.yaraDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/Sanesecurity_spam.yaraDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/badmacro.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/blurl.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/hackingteam.hsbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/junk.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/jurlbl.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/jurlbla.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/lott.ndb## BofhlandDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/bofhland_cracked_URL.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/bofhland_malware_URL.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/bofhland_malware_attach.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/bofhland_phishing_URL.ndb## FoxholeDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/foxhole_all.cdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/foxhole_all.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/foxhole_filename.cdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/foxhole_generic.cdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/foxhole_js.cdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/foxhole_js.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/foxhole_links.ldbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/foxhole_mail.cdb## Malware.expertDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/malware.expert.fpDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/malware.expert.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/malware.expert.ldbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/malware.expert.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/malwarehash.hsbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/phish.ndb## PorcupineDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/phishtank.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/porcupine.hsbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/porcupine.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/rogue.hdb## SpamDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/scam.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/scamnailer.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/shelter.ldbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/spam.ldbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/spamattach.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/spamimg.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/spear.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/spearl.ndb## WinnowDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow.attachments.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow.complex.patterns.ldbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow_bad_cw.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow_extended_malware.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow_extended_malware_links.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow_malware.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow_malware_links.ndb## DatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow_phish_complete.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow_phish_complete_url.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/winnow_spam_complete.ndb## MaldetDatabaseCustomURL https://www.rfxn.com/downloads/rfxn.ndbDatabaseCustomURL https://www.rfxn.com/downloads/rfxn.hdb## Phishing, scams and other junk, hashes of spam documents and imagesDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/crdfam.clamav.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/doppelstern-phishtank.ndbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/doppelstern.hdbDatabaseCustomURL https://ftp.swin.edu.au/sanesecurity/doppelstern.ndb
Salve e saia.


CLAMD.CONF
sudo vim /etc/clamd.conf
Comente ou remova a linha ~8:
# Comment or remove the line below.
# Example ... <<< Linha 8

   Vá descomentando e configurando os parâmetros abaixo (ou deixe tudo comentado e acrescente no final).

   Obs.: Tenha o cuidado de verificar se o usuário do ClamAV na tua distribuição é clamav ou _clamav e mude abaixo na linha User. E no lugar de "seu_usuario" coloque o nome do teu usuário (OnAccessIncludePath /home/seu_usuario/Downloads).

Verifique a linha 269 (User _clamav) e comente ela se for acrescentar tudo abaixo.
#LogFile /var/log/clamd.logLogFileMaxSize 0LogTime yesLogRotate noExtendedDetectionInfo yesDatabaseDirectory /var/lib/_clamavLocalSocket /var/run/clamav/clamd.ctlLocalSocketGroup _clamavLocalSocketMode 660MaxThreads 15ReadTimeout 180SelfCheck 3600 # 60 MinutosVirusEvent /usr/local/bin/notificar-virus.shUser _clamavExitOnOOM yesMaxRecursion 27AlertExceedsMax yes ## On-access Scan Settings## Escaneia somente arquivos ate 100 megas.# Ajuste para tuas necessidades.OnAccessMaxFileSize 100MOnAccessDisableDDD yes##OnAccessIncludePath /home#OnAccessIncludePath /home/usuarioOnAccessIncludePath /home/usuario/Downloads#OnAccessExcludePath /sysOnAccessExcludePath /devOnAccessExcludePath /procOnAccessExcludePath /runOnAccessExcludePath /var/runOnAccessExcludePath /etc/svOnAccessExcludePath /etc/runit#OnAccessPrevention yes#OnAccessExcludeUname _clamav
Salve e saia.

   Obs.: Caso decida habilitar o Clamonacc depois, aconselho a não habilitar #OnAccessIncludePath /home e #OnAccessIncludePath /home/usuario porque pode acontecer de dar umas travadas quando for abrir essas pastas graficamente (clicando com o mouse) e pode acontecer de abrir a pasta de usuário e sumirem os ícones de pastas e de arquivos dando a impressão de que tudo foi apagado. Caso isso acontecer basta desligar o Clamonacc (sudo sv stop clamonacc). O Clamonacc (Proteção em Tempo Real) exerce um poder muito grande sobre os diretórios e arquivos configurados.

   O inotify tem um número limitado de pontos de controle disponíveis para uso por um processo a qualquer momento. Para aumentar o número de inotifywatch-points disponíveis para uso pelo ClamAV, execute:

Para testar:
sudo echo 104857600 | sudo tee -a /proc/sys/fs/inotify/max_user_watches
Saída: 104857600


Permanente:
sudo echo 'fs.inotify.max_user_watches=104857600' | sudo tee /etc/sysctl.d/99-inotify.conf
Saída: fs.inotify.max_user_watches=104857600


AVISO
   O número ali são 100M convertidos em bytes. Esse número deve ser o mesmo do parâmetro OnAccessMaxFileSize. Caso você mudar o número do parâmetro OnAccessMaxFileSize deve executar esse comando novamente com o novo número.


   O ClamAV não tem um arquivo de quarentena por padrão, então vamos criá-lo e configurá-lo.

Criando diretório e arquivo e permissionando:
sudo mkdir -p /var/opt/clamav-quarentena
sudo touch /var/opt/clamav-quarentena/quarentena.log
sudo chown -R _clamav:_clamav /var/opt/clamav-quarentena
sudo chmod 700 /var/opt/clamav-quarentena
sudo chmod 664 /var/opt/clamav-quarentena/quarentena.log

Desativando a Execução de Arquivos (Montagem Segura)

   A maior ameaça de uma quarentena é um usuário ou script executar acidentalmente um binário infectado que está lá dentro.

   A forma mais robusta de impedir isso no Linux é isolar o diretório em uma montagem separada (ou usando um loop device) com a flag noexec.

Vamos aplicar um "bind mount" no /etc/fstab.
sudo vim /etc/fstab
      Adicione a seguinte linha no final para aplicar restrições estritas de segurança (noexec, nosuid e nodev impedem a execução de programas, binários SUID e criação de dispositivos):
...
/var/opt/clamav-quarentena /var/opt/clamav-quarentena none bind,noexec,nosuid,nodev 0 0

Montando imediatamente:
sudo mount -a
   Criando um script de limpeza que preserva os arquivos quarentena.log e os logrotate e limpa os demais:
sudo vim /usr/local/bin/limpar-quarentena.sh
Coloque dentro:
#!/bin/sh# Script para remover arquivos da quarentena do ClamAV com mais de 30 diasPASTA_GERAL="/var/opt/clamav-quarentena"DIAS_LIMITE=30 # Verifica se o diretório existe antes de tentar limparif [ -d "$PASTA_GERAL" ]; then# Procura por arquivos comuns (-type f) modificados há mais de 30 dias (-mtime +30) e os remove, EXCETO o log, os compactados (.gz) e arquivos ocultos do script    find "$PASTA_GERAL" -type f -mtime +$DIAS_LIMITE \        ! -name "quarentena.log" \        ! -name "quarentena.log.*" \        ! -name ".*" \        -deletefi
Salve e saia.

Permissionando:
sudo chmod +x /usr/local/bin/limpar-quarentena.sh && sudo chown _clamav:_clamav /usr/local/bin/limpar-quarentena.sh

SCRIPT DE MONITORAMENTO E AVISO
sudo vim /usr/local/bin/monitor-quarentena.sh
Coloque dentro (adapte para teu usuário ClamAV):
#!/bin/sh # Configuracoes#PASTA_GERAL="/var/opt/clamav-quarentena"ARQUIVO_ESTADO="$PASTA_GERAL/.ultimo_total"LOG="$PASTA_GERAL/quarentena.log"# EMAIL_DESTINO="seu_email@dominio.com"  #  <- Altere para teu e-mail # Garante que o arquivo de estado existaif [ ! -f "$ARQUIVO_ESTADO" ]; then    runuser -u _clamav -- touch "$ARQUIVO_ESTADO"    echo 0 | runuser -u _clamav -- tee "$ARQUIVO_ESTADO" > /dev/nullfi # Conta quantos arquivos existem atualmente na quarentenatotal_atual=$(find "$PASTA_GERAL" -type f ! -name "quarentena.log" ! -name ".*" | wc -l)total_anterior=$(cat "$ARQUIVO_ESTADO") # Se o numero atual for maior que o anterior, ha novos arquivosif [ "$total_atual" -gt "$total_anterior" ]; then    novos_arquivos=$((total_atual - total_anterior)) # Lista os nomes dos arquivos mais recentes que entraram na quarentena    arquivos_novos=$(find "$PASTA_GERAL" -type f ! -name "quarentena.log" ! -name ".*" -printf "%T@ %f\n" | sort -n | tail -n "$novos_arquivos" | cut -d' ' -f2-) # Monta a estrutura do e-mail com os cabecalhos que o msmtp precisa#    assunto="[ClamAV] ALERTA: Novo(s) malware(s) isolado(s) na quarentena" #   (#   echo "Subject: $assunto"#   echo "To: $EMAIL_DESTINO"#   echo "Content-Type: text/plain; charset=UTF-8"#   echo "" # Linha em branco obrigatoria separando cabecalho do corpo#   echo "Olá,"#   echo ""#   echo "O sistema de monitoramento detectou $novos_arquivos novo(s) arquivo(s) na pasta de quarentena."#   echo ""#   echo "Lista de arquivos detectados:"#   echo "$arquivos_novos"#   echo ""#   echo "Por favor, verifique o servidor."#   echo "Data do evento: $(date '+%d/%m/%Y %H:%M:%S')"#   ) | msmtp -C /etc/msmtprc "$EMAIL_DESTINO" # --- Popup na area de trabalho (Void Linux, sem systemd/loginctl) --- # 1. Descobre o usuario com sessao grafica ativa (registrado no utmp como :0, :1 etc.)    usuario=$(who | awk '/\(:[0-9]+(\.[0-9]+)?\)/ {print $1; exit}')    if [ -n "$usuario" ]; then        display=""        dbus_addr="" # 2. Varre os processos do usuario procurando DISPLAY e DBUS_SESSION_BUS_ADDRESS no environ    for p in /proc/[0-9]*; do        pid=${p#/proc/}        dono=$(stat -c %U "$p" 2>/dev/null)        [ "$dono" != "$usuario" ] && continue         if [ -r "$p/environ" ] && tr '{BARRA}0' '\n' < "$p/environ" 2>/dev/null | grep -q '^DISPLAY='; then            display=$(tr '{BARRA}0' '\n' < "$p/environ" | grep '^DISPLAY=' | head -n1 | cut -d= -f2-)            dbus_addr=$(tr '{BARRA}0' '\n' < "$p/environ" | grep '^DBUS_SESSION_BUS_ADDRESS=' | head -n1 | cut -d= -f2-)            [ -n "$display" ] && [ -n "$dbus_addr" ] && break        fi    done # Fallbacks, caso a varredura nao encontre nada        [ -z "$display" ] && display=":0"        if [ -z "$dbus_addr" ]; then            uid_usuario=$(id -u "$usuario")            socket_dbus=$(find /run/user/"$uid_usuario"/dbus-1 -type s -name 'bus' 2>/dev/null | head -n1)            if [ -n "$socket_dbus" ]; then                dbus_addr="unix:path=$socket_dbus"            fi        fi # Mensagem com Zenity# if [ -n "$dbus_addr" ]; then#       runuser -u "$usuario" -- env DISPLAY="$display" DBUS_SESSION_BUS_ADDRESS="$dbus_addr" \#           zenity --error --title="ClamAV - Quarentena" --width=450 \#           --text="<span foreground='red' size='large'><b>AVISO: ClamAV - Quarentena!</b></span>\n\n$novos_arquivos novo(s) arquivo(s) detectado(s).\nVerifique o e-mail ou o log." \#           2>/dev/null &#  fi # Mensagem com notify-send        if [ -n "$dbus_addr" ]; then            runuser -u "$usuario" -- env DISPLAY="$display" DBUS_SESSION_BUS_ADDRESS="$dbus_addr" \                notify-send -u critical -i /usr/share/icons/icone-alerta.png \                "ClamAV - Quarentena" \                "<b>AVISO: $novos_arquivos novo(s) arquivo(s) detectado(s).\nVerifique e-mail e /var/opt/clamav-quarentena/quarentena.log.</b>" &        fi    fi     mensagem="ALERTA: $novos_arquivos novo(s) arquivo(s) isolado(s):\n$arquivos_novos" # 1. Monta a linha com a data atual    linha_log="$(date '+%Y-%m-%d %H:%M:%S') -> $mensagem" # 2. Grava no arquivo de log com o usuário _clamav e exibe mensagem no terminal# echo "$linha_log" | runuser -u _clamav -- tee -a "$LOG"# Grava no arquivo de log e não exibe mensagem no terminal    echo "$linha_log" | runuser -u _clamav -- sh -c 'cat >> "$1"' _ "$LOG"fi # Atualiza o arquivo de estadoecho "$total_atual" | runuser -u _clamav -- tee "$ARQUIVO_ESTADO" > /dev/null
Salve e saia.

   Este script de avisos é somente um exemplo, cabe a você adaptar para o teu provedor de e-mail e tuas configurações, pois não é o escopo do artigo.

As linhas:

EMAIL_DESTINO

e da linha assunto=

até

) | msmtp

estão comentadas para fins de teste sem precisar configurar envio de e-mail, somente dará o popup de aviso na tela que permanecerá até clicar em cima dele.

Permissionando:
sudo chmod +x /usr/local/bin/monitor-quarentena.sh && sudo chown _clamav:_clamav /usr/local/bin/monitor-quarentena.sh
Vamos testar criando um arquivo "suspeito" dentro do diretório de quarentena:
sudo touch /var/opt/clamav-quarentena/teste.txt
Resete o arquivo de estado para ZERO para forçar o alerta:
sudo echo 0 | sudo runuser -u _clamav -- tee /var/opt/clamav-quarentena/.ultimo_total
Executando o script manualmente:
sudo /usr/local/bin/monitor-quarentena.sh
E vemos a mensagem de alerta com o Zenity.


Vemos a mensagem de alerta com o Notify-send e XFCE.


Mensagem de alerta com Cinnamon e Notify-send.


   Eu prefero o Notify-send porque ele fica na tela até clicar em cima do aviso e não minimiza se clicar fora dele, como o Zenity.

Caso quiser o Zenity, instale:
sudo xbps-install zenity
Verifique também:
sudo cat /var/opt/clamav-quarentena/quarentena.log
Saída:2026-09-18 11:14:53 -> ALERTA: 1 novo(s) arquivo(s) isolado(s): teste.txt

Deletando o arquivo:
sudo rm /var/opt/clamav-quarentena/teste.txt
Vendo se tudo continuou igual:
sudo ls -la /var/opt/clamav-quarentena
total 4
drwx------ 1 _clamav _clamav 54 set 23 09:05 .
drwxr-xr-x 1 root root 34 set 23 09:02 ..
-rw-r--r-- 1 _clamav _clamav 2 set 23 09:10 .ultimo_total
-rw-r--r-- 1 _clamav _clamav 0 set 23 09:02 quarentena.log


   Tem de ter 4 arquivos e esse é o único que deve estar como root:

drwxr-xr-x 1 root root 34 21 09:02 ..

   Os outros tem que estar com o usuário _clamav como dono.

   Caso o ClamAV detectar um malware num escaneamento e movê-lo para a quarentena, esses arquivos poderão estar com outro dono, porém, os 4 arquivos básicos tem de estar nesse padrão.


Para ver as últimas 10 linhas quando o arquivo estiver maior:
sudo tail -n 10 /var/opt/clamav-quarentena/quarentena.log
No XFCE, caso quiser incrementar o layout do alerta com o notify-send, execute:
sudo xfce4-notifyd-config
E depois reinicie:
sudo pkill xfce4-notifyd
   As opções são poucas, mas a vantagem é que o alerta fica na tela até você clicar em cima dele.

   Com o Zenity, o alerta dá para fazer um layout melhor, mas ao clicar fora, ele minimiza e pode acontecer de você esquecer, desligar a máquina e não verificar o e-mail nem o log.

   Vai de você escolher a melhor opção para seu gosto: notify-send ou zenity.

   No Cinnamon o caminho é: Menu > Configurações do sistema > na seção "Preferências", clique em Notificações.

No terminal:
cinnamon-settings notifications

Criando arquivo de gravação do log da quarentena
sudo vim /usr/local/bin/notificar-virus.sh
#!/bin/sh# Recebe as variaveis nativas do ClamAVPASTA_GERAL="/var/opt/clamav-quarentena"LOG_ARQUIVO="$PASTA_GERAL/quarentena.log" mensagem="ALERTA EM TEMPO REAL (/usr/local/bin/notificar-virus.sh): Arquivo suspeito '$CLAM_VIRUSEVENT_FILENAME' detectado e isolado (Vírus: $CLAM_VIRUSEVENT_VIRUSNAME)." # Grava imediatamente no log com o usuario _clamavecho "$(date '+%Y-%m-%d %H:%M:%S') -> $mensagem" | runuser -u _clamav -- tee -a "$LOG_ARQUIVO"
Salve e saia.
sudo chmod +x /usr/local/bin/notificar-virus.sh && sudo chown _clamav:_clamav /usr/local/bin/notificar-virus.sh
   Este arquivo está nas configurações do /etc/clamd.conf (VirusEvent /usr/local/bin/notificar-virus.sh).

   Como o script periódico /usr/local/bin/monitor-quarentena.sh configurado no Cron lê a quantidade de arquivos na pasta e compara com o estado anterior (.ultimo_total), ele também vai perceber que um novo arquivo chegou (movido pelo Clamonacc) e disparará o aviso caso o número mude.


Fazendo o LOGROTATE

Instalando:
sudo xbps-install -S logrotate
Criando o arquivo:
sudo vim /etc/logrotate.d/clamav-quarentena
Coloque dentro:
/var/opt/clamav-quarentena/quarentena.log {    monthly    rotate 6    compress    delaycompress    missingok    notifempty    create 0640 _clamav _clamav    su _clamav _clamav    copytruncate}
Salve e saia.

   Assim o arquivo não crescerá demais.

Verificando:
sudo logrotate -d /etc/logrotate.d/clamav-quarentena
warning: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.d/clamav-quarentena
Reading state from file: /var/lib/logrotate.status
Allocating hash table for state file, size 64 entries
Creating new state
Creating new state
Creating new state

Handling 1 logs

rotating pattern: /var/opt/clamav-quarentena/quarentena.log monthly empty log files are not rotated, (6 rotations), old logs are removed
switching euid from 0 to 989 and egid from 0 to 988 (pid 10363)
considering log /var/opt/clamav-quarentena/quarentena.log
Creating new state
  Now: 2026-09-23 22:35
  Last rotated at 2026-09-23 22:00
  log does not need rotating (log has already been rotated)
switching euid from 989 to 0 and egid from 988 to 0 (pid 10363)
A saída indica que tudo está correto.


Criando logrotate para o Freshclam e Clamd:
sudo vim /etc/logrotate.d/clamav
Coloque dentro:
/var/log/clamd.log /var/log/freshclam.log {<br/>    monthly<br/>    rotate 6<br/>    compress<br/>    delaycompress<br/>    missingok<br/>    notifempty<br/>    create 0640 _clamav _clamav<br/>    sharedscripts<br/>    postrotate<br/>        vsv reload clamd >/dev/null 2>&1 || true<br/>        vsv reload freshclam >/dev/null 2>&1 || true<br/>    endscript<br/>}
Verificando:
sudo logrotate -d /etc/logrotate.d/clamav

Parâmetros

  • monthly: O arquivo de log será rotacionado uma vez por mês (geralmente no primeiro dia do mês).
  • rotate 6: O sistema vai guardar no máximo 6 arquivos antigos de log. Quando o 7º mês chegar, o log mais antigo de todos será deletado permanentemente.
  • compress: Compacta os logs antigos no formato .gz para economizar espaço em disco.
  • delaycompress: Adia a compactação do log anterior para o próximo ciclo de rotação. Na prática, o log do mês atual estará ativo, o do mês passado estará rotacionado mas em texto puro (.1), e apenas do retrasado em diante estarão compactados (.2.gz, .3.gz). Isso é útil se algum programa ainda precisar escrever ou ler o log logo após a virada.
  • missingok: Se o arquivo quarentena.log não existir por algum motivo (ex: foi deletado manualmente), o logrotate não vai gerar nenhum erro e passará para o próximo serviço silenciosamente.
  • notifempty: Não rotaciona o log se ele estiver vazio. Se o ClamAV não pegou nenhuma ameaça no mês e o arquivo estiver com 0 bytes, o logrotate ignora o ciclo e economiza processamento.
  • create 0640 _clamav _clamav: Logo após rotacionar (mover) o arquivo antigo, o logrotate cria um arquivo quarentena.log novinho em folha com as permissões 0640 (leitura/escrita para o dono, leitura para o grupo) e define o dono como usuário _clamav e grupo _clamav.
  • sharedscripts: Garante que o bloco postrotate (os comandos de recarregamento) seja executado apenas uma vez no final, em vez de disparar uma vez para cada arquivo.
  • vsv reload: No Void Linux, o utilitário vsv (ou sv reload) envia um sinal HUP controlado para o runit. Isso força o ClamAV e o Freshclam a fecharem o descritor de arquivo antigo e começarem a gravar no novo arquivo zerado que o create 0640 acabou de gerar.

   Agora precisamos atualizar o banco de dados, o que pode demorar alguns minutos.

   Dependendo de como você instalou e da versão do ClamAV que você está usando, pode encontrar erros na primeira vez que executar o Freshclam.

   Ao executar o Freshclam, o programa tentará buscar uma atualização no endereço especificado na linha DatabaseMirror; caso não encontre, ele passará para o endereço subsequente, até encontrar e baixar as atualizações. Depois, ele executará todas as DatabaseCustomURL.

   Porém, primeiro temos que rodar o comando que habilita o serviço do Clamd e integra ao runit, assim ele será iniciado junto com o sistema:
sudo ln -s /etc/sv/clamd /var/service/
Tentando iniciar o Clamd:
sudo sv start clamd
Saída:
timeout: down: clamd: 0s, normally up, want up

   Provavelmente dará "down" porque é um bug em que, mesmo o Clamd não iniciando, faz-se necessário rodar o comando antes de atualizar o banco de dados para não dar o WARNING de que o Clamd não foi notificado.

   Para rodar o Freshclam do jeito certo, sempre execute-o invocando o usuário do ClamAV:
sudo -u _clamav freshclam
ou
sudo -u clamav freshclam
...
Wed Sep 23 22:44:45 2026 -> Database test passed.
Wed Sep 23 22:44:45 2026 -> doppelstern.ndb updated (version: custom database, sigs: 1)
Wed Sep 23 22:44:45 2026 -> fc_download_url_database: doppelstern.ndb updated.
Wed Sep 23 22:44:45 2026 -> Database update completed successfully.
Wed Sep 23 22:44:45 2026 -> Clamd successfully notified about the update.

   Terminará sem erros com essas últimas linhas acima.

   Caso apareça um WARNING como esse no final:
WARNING: Wed Sep 16 12:02:53 2026 -> Clamd was NOT notified: Can't connect to Clamd through /var/run/clamav/clamd.ctl: No such file or directory
não se preocupe, falta iniciar o Clamd.

Caso dê erro, veja qual é o erro e repare. Por exemplo:
ERROR: Fri Sep 4 15:48:00 2026 -> NotifyClamd: No communication socket specified in /etc/clamd.conf
ERROR: Fri Sep 4 15:48:00 2026 -> Can't send to clamd: Socket operation on non-socket
Esse erro significa que alguma configuração no arquivo /etc/clamd.conf está em desacordo.

Caso apareça um WARNING como esse no final:
WARNING: Tue Sep 8 09:56:06 2026 -> Clamd was NOT notified: Can't connect to Clamd through /var/run/clamav/clamd.ctl: Permission denied

confira essas linhas:
LocalSocket /var/run/clamav/clamd.ctl
FixStaleSocket true
LocalSocketGroup clamav
LocalSocketMode 666

   E rode o comando sudo -u _clamav freshclam (ou sudo -u clamav freshclam) novamente. E, caso as linhas estejam corretas, não se preocupe: depois, ao iniciar o Clamd, esse aviso desaparece.

   Para outros erros, veja este link que aborda a maioria dos erros ao executar o Freshclam pela primeira vez:

https://docs.clamav.net/faq/faq-freshclam.html

   Ou copie e cole o comando com o erro e jogue no Google ou em alguma IA.


Iniciando o Serviço CLAMD no Void
sudo sv start clamd
ok: run: clamd: (pid 21883) 34s

Caso queira, pode executar novamente:
sudo -u _clamav freshclam
Depois, pode sempre verificar com:
sudo sv status clamd
run: clamd: (pid 19534) 3s; run: log: (pid 18660) 259s


Verificando com Htop.
$ sudo htop


Verificando com ClamdTop.
$ sudo clamdtop

E quando quiser parar ou reiniciar:
sudo sv stop clamd
sudo sv restart clamd

Para outros sistemas, veja:

https://www.vivaolinux.com.br/artigo/Antivirus-ClamAV-com-protecao-em-tempo-real/

https://www.vivaolinux.com.br/artigo/ClamAV-o-kit-de-ferramentas-antivirus/


Vendo as últimas 10 linhas para verificar se os logs estão funcionando:
sudo tail -n 10 /var/log/freshclam.log
Mon Sep 21 09:22:18 2026 -> download_complete_callback: fc_context->bTestDatabases : 1
Mon Sep 21 09:22:18 2026 -> download_complete_callback: fc_context->bBytecodeEnabled : 1
Mon Sep 21 09:22:18 2026 -> Testing database: '/var/lib/_clamav/tmp.9f45e86cf8/clamav-4821cfa51c2c06a78e61b54f2a22520a.tmp-doppelstern.ndb' ...
Mon Sep 21 09:22:18 2026 -> Loading signatures from /var/lib/_clamav/tmp.9f45e86cf8/clamav-4821cfa51c2c06a78e61b54f2a22520a.tmp-doppelstern.ndb
Mon Sep 21 09:22:18 2026 -> Properly loaded 1 signatures from /var/lib/_clamav/tmp.9f45e86cf8/clamav-4821cfa51c2c06a78e61b54f2a22520a.tmp-doppelstern.ndb
Mon Sep 21 09:22:18 2026 -> Database test passed.
Mon Sep 21 09:22:18 2026 -> doppelstern.ndb updated (version: custom database, sigs: 1)
Mon Sep 21 09:22:18 2026 -> fc_download_url_database: doppelstern.ndb updated.
Mon Sep 21 09:22:18 2026 -> Database update completed successfully.
Mon Sep 21 09:22:18 2026 -> Clamd successfully notified about the update.

sudo tail -n 10 /var/log/clamd.log
Mon Sep 21 09:39:28 2026 -> ELF support enabled.
Mon Sep 21 09:39:28 2026 -> Mail files support enabled.
Mon Sep 21 09:39:28 2026 -> OLE2 support enabled.
Mon Sep 21 09:39:28 2026 -> PDF support enabled.
Mon Sep 21 09:39:28 2026 -> SWF support enabled.
Mon Sep 21 09:39:28 2026 -> HTML support enabled.
Mon Sep 21 09:39:28 2026 -> XMLDOCS support enabled.
Mon Sep 21 09:39:28 2026 -> HWP3 support enabled.
Mon Sep 21 09:39:28 2026 -> OneNote support enabled.
Mon Sep 21 09:39:28 2026 -> Self checking every 3600 seconds.

Para ver em tempo real:
sudo tail -f /var/log/clamd.log
Mon Sep 21 09:39:28 2026 -> ELF support enabled.
Mon Sep 21 09:39:28 2026 -> Mail files support enabled.
Mon Sep 21 09:39:28 2026 -> OLE2 support enabled.
Mon Sep 21 09:39:28 2026 -> PDF support enabled.
Mon Sep 21 09:39:28 2026 -> SWF support enabled.
Mon Sep 21 09:39:28 2026 -> HTML support enabled.
Mon Sep 21 09:39:28 2026 -> XMLDOCS support enabled.
Mon Sep 21 09:39:28 2026 -> HWP3 support enabled.
Mon Sep 21 09:39:28 2026 -> OneNote support enabled.
Mon Sep 21 09:39:28 2026 -> Self checking every 3600 seconds.

Ctrl+c para sair.

Verifique se o clamd.ctl foi criado em /var/run/clamav:
sudo ls -la /var/run/clamav/
total 0
drwxr-x--- 2 _clamav _clamav 60 set 23 22:36 .
drwxr-xr-x 23 root root 620 set 23 22:07 ..
srw-rw---- 1 _clamav _clamav 0 set 23 22:36 clamd.ctl



On-Access Scanning

   Agora vamos habilitar o Clamonacc, conhecido também como Proteção em Tempo Real.

   O ClamAV não tem aquela proteção que fica o tempo todo escaneando o computador; ele somente escaneia o diretório e/ou o arquivo quando é acessado. O cliente Clamonacc para o daemon de varredura Clamd fornece varredura no acesso em versões modernas do Linux, incluindo um recurso opcional para bloquear o acesso ao arquivo até que ele seja verificado.


IMPORTANTE
   Caso o fanotify não esteja habilitado no kernel, não adianta fazer esse procedimento sem antes habilitá-lo.

Para configurar o Clamonacc, basta ajustar o arquivo /etc/clamd.conf.

Como as configurações já estão no arquivo, deixo aqui os passos básicos:
    • Abra o arquivo /etc/clamd.conf;
    • Especifique o(s) caminho(s) que você gostaria de monitorar definindo a opção OnAccessIncludePath;
    • Defina OnAccessPrevention para yes;
    • Verifique qual nome de usuário está sendo usado para executar o comando, clamav ou _clamav;
    • Defina OnAccessExcludeUname para o nome de usuário correspondente;
    • Salve seu trabalho e feche o clamd.conf.

Criando o Clamonacc no Void
sudo mkdir -p /etc/sv/clamonacc
sudo vim /etc/sv/clamonacc/run
Coloque dentro:
#!/bin/shsv check clamd >/dev/null 2>&1 || exit 1exec sudo clamonacc --fdpass --move=/var/opt/clamav-quarentena -F
Salve e saia.
sudo chmod +x /etc/sv/clamonacc/run
sudo ln -s /etc/sv/clamonacc /var/service/
sudo sv start clamonacc
ok: run: clamonacc: (pid 12570) 7s

sudo sv restart clamonacc
ok: run: clamonacc: (pid 12716) 1s

sudo sv status clamonacc
run: clamonacc: (pid 12716) 42s


Para verificar melhor, pode usar o htop:

htop



TESTES


   O padrão mundial para testar antivírus sem usar código malicioso real é o EICAR Standard Anti-Virus Test File. Qualquer antivírus atualizado, incluindo o ClamAV, vai identificá-lo imediatamente como uma ameaça chamada Win.Test.EICAR_HBR-1 ou similar.

   Códigos de retorno do ClamAV: 0 = limpo, 1 = infectado, 2 = erro

   Coloque a opção OnAccessIncludePath /home/seu_usuario/Downloads no arquivo:
sudo vim /etc/clamd.conf
##OnAccessIncludePath /home
##OnAccessIncludePath /home/seu_usuario
OnAccessIncludePath /home/seu_usuario/Downloads

Reinicie os serviços:
sudo sv restart clamd
ok: run: clamd: (pid 15652) 0s

sudo sv restart clamonacc
ok: run: clamonacc: (pid 15702) 1s

Tentando criar o arquivo:
echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
bash: /home/usuario/Downloads/eicar.com: Operação não permitida

  Isso deve acontecer porque no arquivo /etc/clamd.conf o caminho /home/seu_usuario/Downloads está no OnAccessIncludePath.


AVISO IMPORTANTE
   Em algumas interfaces gráficas, como o Cinnamon, não haverá aviso no terminal, mas a proteção está funcionando. Após dar o echo, basta verificar a pasta ~/Downloads e ver que o arquivo não está lá e verificar o diretório /var/opt/clamav-quarentena:
sudo ls -la /var/opt/clamav-quarentena
Faremos com sudo:
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
Tentando ler o arquivo:
cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Operação não permitida

No XFCE o Clamonacc não deixa acessar o arquivo e depois move para a quarentena.
cat ~/Downloads/eicar.com
cat: /home/kluster/Downloads/eicar.com: Arquivo ou diretório inexistente

   No Cinnamon o arquivo é movido para a quarentena antes de qualquer processo sequer conseguir ler.

   O comportamento diferente ocorre porque o Cinnamon e o XFCE gerenciam de formas distintas os erros de sistema originados por chamadas do kernel e as notificações para o usuário.

   Quando damos o echo, o bash consegue criar o arquivo temporariamente na memória, mas no milissegundo seguinte o indexador do Cinnamon tenta ler o arquivo para gerar um ID/miniatura. Isso dispara o gatilho do ClamAV, que bloqueia o acesso e move o arquivo imediatamente.

   Códigos de retorno do ClamAV: 0 = limpo, 1 = infectado, 2 = erro

Tentaremos com sudo:

sudo cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Arquivo ou diretório inexistente

   Perceba que o arquivo foi movido para a quarentena porque colocamos no arquivo /etc/sc/clamonacc/run a opção --move=/var/opt/clamav-quarentena e foi registrado no log porque colocamos no arquivo /etc/clamd.conf a opção VirusEvent /usr/local/bin/notificar-virus.sh:
sudo ls -la /var/opt/clamav-quarentena
total 12
drwx------ 1 _clamav _clamav 160 set 21 09:51 .
drwxr-xr-x 1 root root 34 set 21 09:02 ..
-rw------- 1 root root 0 set 21 09:45 .clamav-quarantine-lock.12718.0
-rw-r--r-- 1 _clamav _clamav 2 set 21 09:50 .ultimo_total
-rw------- 1 root root 69 set 14 15:55 eicar.com
-rw------- 1 root root 69 set 21 09:48 eicar.com.001
-rw-r--r-- 1 _clamav _clamav 0 set 21 09:02 quarentena.log

   O arquivo eicar.com.001 é um arquivo de controle que o ClamAV cria automaticamente.

Testando novamente com sudo nos dois comandos:
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
sudo cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Operação não permitida

sudo cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Arquivo ou diretório inexistente
sudo ls -la /var/opt/clamav-quarentena
total 16
drwx------ 1 _clamav _clamav 186 set 21 09:58 .
drwxr-xr-x 1 root root 34 set 21 09:02 ..
-rw------- 1 root root 0 set 21 09:45 .clamav-quarantine-lock.12718.0
-rw-r--r-- 1 _clamav _clamav 2 set 21 09:56 .ultimo_total
-rw------- 1 root root 69 set 14 15:55 eicar.com
-rw------- 1 root root 69 set 21 09:48 eicar.com.001
-rw------- 1 root root 69 set 21 09:57 eicar.com.002
-rw-r--r-- 1 _clamav _clamav 0 set 21 09:02 quarentena.log

sudo cat /var/opt/clamav-quarentena/quarentena.log
2026-09-21 09:03:32 -> ALERTA EM TEMPO REAL: Arquivo suspeito '/home/seu_usuario/Downloads/eicar.com' detectado e isolado (Vírus: {HEX}test.test.eicar.1040.UNOFFICIAL)


Testando Escaneamento

   Lembrando que o Clamscan não utiliza arquivo de configurações, mas parâmetros próprios no binário; porém, logo faremos um wrapper para ele, pois o utilizaremos para as varreduras com o cron.
sudo clamscan ~/Downloads
Loading: 6s, ETA: 0s [========================>] 3.80M/3.80M sigs
Compiling: 2s, ETA: 0s [========================>] 42/42 tasks

/home/seu_usuario/Downloads/grub-void.html: OK
/home/seu_usuario/Downloads/vkpurge.html: OK
/home/seu_usuario/Downloads/zram-zswap.mhtml: OK
/home/seu_usuario/Downloads/linux-7.1.2.tar.xz: OK
/home/seu_usuario/Downloads/apache-netbeans.svg: OK
/home/seu_usuario/Downloads/wgcf-master.zip: OK
/home/seu_usuario/Downloads/wgcf-account.toml: OK

----------- SCAN SUMMARY -----------
Known viruses: 3797093
Engine version: 1.5.3
Scanned directories: 1
Scanned files: 7
Infected files: 0
Data scanned: 16.27 MiB
Data read: 159.41 MiB (ratio 0.10:1)
Time: 19.103 sec (0 m 19 s)
Start Date: 2026:09:23 23:41:10
End Date: 2026:09:23 23:41:29

sudo clamscan ~/Downloads/eicar.com
Loading: 10s, ETA: 0s [========================>] 3.80M/3.80M sigs
Compiling: 2s, ETA: 0s [========================>] 42/42 tasks

WARNING: Can't open file /home/usuario/Downloads/eicar.com: Operation not permitted

----------- SCAN SUMMARY -----------
Known viruses: 3796968
Engine version: 1.5.3
Scanned directories: 0
Scanned files: 0
Infected files: 0
Total errors: 1
Data scanned: 0 B
Data read: 69 B (ratio 0.00:1)
Time: 12.426 sec (0 m 12 s)
Start Date: 2026:09:21 12:54:17
End Date: 2026:09:21 12:54:30

sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
   O Clamdscan utiliza os parâmetros do arquivo /etc/clamd.conf nas varreduras, bem como o Clamonacc na proteção.
sudo clamdscan --stream ~/Downloads
/home/kluster/Downloads: OK

----------- SCAN SUMMARY -----------
Infected files: 0
Time: 148.057 sec (2 m 28 s)
Start Date: 2026:09:24 00:07:13
End Date: 2026:09:24 00:09:41

sudo clamdscan --stream ~/Downloads/eicar.com
/home/usuario/Downloads/eicar.com: Failed to open file. ERROR

----------- SCAN SUMMARY -----------
Infected files: 0
Total errors: 1
Time: 0.019 sec (0 m 0 s)
Start Date: 2026:09:21 12:56:14
End Date: 2026:09:21 12:56:14
   Podemos ver que o Clamonacc no XFCE não deixa nem o Clamscan e nem o Clamdscan acessarem o arquivo virulento, nem com sudo e nem com o próprio usuário _clamav.

   Porém, ao escanear ~/Downloads ele permite somente com o Clamscan e bloqueia com Clamdscan, porque o Clamd e o Clamonacc utilizam o mesmo arquivo /etc/clamd.conf, enquanto o Clamscan é independente.

https://docs.clamav.net/manual/Usage/Scanning.html#clamdscan

https://docs.clamav.net/manual/Usage/Scanning.html#clamscan


Vamos comentar o diretório /home/seu_usuario/Downloads no arquivo:
sudo vim /etc/clamd.conf
Comente:
#OnAccessIncludePath /home/seu_usuario/Downloads

Salve e saia.
sudo sv restart clamd
ok: run: clamd: (pid 31196) 0s

sudo sv restart clamonacc
ok: run: clamonacc: (pid 31276) 0s

sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
clamscan ~/Downloads/eicar.com
Loading: 9s, ETA: 0s [========================>] 3.80M/3.80M sigs
Compiling: 2s, ETA: 0s [========================>] 42/42 tasks

/home/usuario/Downloads/eicar.com: {HEX}test.test.eicar.1040.UNOFFICIAL FOUND

----------- SCAN SUMMARY -----------
Known viruses: 3796968
Engine version: 1.5.3
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 69 B
Data read: 69 B (ratio 1.00:1)
Time: 12.357 sec (0 m 12 s)
Start Date: 2026:09:21 12:58:58
End Date: 2026:09:21 12:59:10

cat ~/Downloads/eicar.com
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

   Vemos que o arquivo foi lido.

   Obs.: para o arquivo ser movido para a quarentena, o parâmetro --move=/caminho/quarentena deve ser passado no comando.

   Primeiro utilizei o Clamscan porque tem uma saída mais completa, mas demora mais porque carrega todo o banco de dados na memória RAM cada vez.

   O resultado mostra que o motor do ClamAV está totalmente operacional e atualizado com mais de 3,7 milhões de assinaturas conhecidas. Ele identificou o arquivo instantaneamente como FOUND.

   Porém, o comando demorou 12.357 segundos para escanear um único arquivo de apenas 69 bytes. Isso acontece porque o Clamscan precisa carregar todas as assinaturas de vírus na memória RAM do zero toda vez que é executado.

   Vamos fazer esse mesmo escaneamento em fração de milissegundos usando o comando clamdscan com a flag --stream para enviar o arquivo ao daemon local (Clamd) que já está rodando em segundo plano com a base de dados pré-carregada na RAM.
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
sudo clamdscan --stream ~/Downloads/eicar.com
/home/usuario/Downloads/eicar.com: {HEX}test.test.eicar.1040.UNOFFICIAL FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 0.024 sec (0 m 0 s)
Start Date: 2026:09:21 13:01:34
End Date: 2026:09:21 13:01:34

   Observe que o tempo de escaneamento caiu de 12.357 segundos para apenas 0.024 segundos.


Testando
clamscan ~/Downloads/
Loading: 10s, ETA: 0s [========================>] 3.80M/3.80M sigs
Compiling: 2s, ETA: 0s [========================>] 42/42 tasks

/home/usuario/Downloads/images.jpeg: OK
/home/usuario/Downloads/26055.txt: OK
/home/usuario/Downloads/18153.txt: OK
/home/usuario/Downloads/5174256.png: OK
/home/usuario/Downloads/calvin-midia.webp: OK
/home/usuario/Downloads/biblia-terminal-main.zip: Sanesecurity.Foxhole.Zip_exe.UNOFFICIAL FOUND
/home/usuario/Downloads/0x0.webp: OK
/home/usuario/Downloads/demolition.webp: OK
/home/usuario/Downloads/idiocracia.webp: OK
/home/usuario/Downloads/celine-nietzsche.pdf: OK
/home/usuario/Downloads/Ardil-22 - Joseph Heller.pdf: OK
/home/usuario/Downloads/eicar.com: {HEX}test.test.eicar.1040.UNOFFICIAL FOUND
...

----------- SCAN SUMMARY -----------
Known viruses: 3797062
Engine version: 1.5.3
Scanned directories: 1
Scanned files: 54
Infected files: 2
Total errors: 1
Data scanned: 530.29 MiB
Data read: 742.51 MiB (ratio 0.71:1)
Time: 439.155 sec (7 m 19 s)
Start Date: 2026:09:24 07:51:59
End Date: 2026:09:24 07:59:19
   Observem que ele acusou dois vírus: o arquivo eicar.com e o arquivo biblia-terminal-main.zip como Sanesecurity.Foxhole.Zip_exe.UNOFFICIAL FOUND. Este talvez seja um falso positivo, mas, por via das dúvidas, foi para a quarentena.

https://sanesecurity.com/foxhole-databases/



Definições:
  • Known viruses: 3797062 - Banco de dados com 3.797.062 tipos de malwares conhecidos
  • Engine version: 1.5.3 - Versão do ClamAV
  • Scanned directories: 1 - Diretórios escaneados
  • Scanned files: 54 - Arquivos escaneados
  • Infected files: 2 - Arquivos infectados
  • Total errors: 1 - Total de erros
  • Data scanned: 530.29 MiB - Total de dados escaneados
  • Data read: 742.51 MiB (ratio 0.71:1) - Total de dados lidos
  • Time: 439.155 sec (7 m 19 s) - Duração do escaneamento
  • Start Date: 2026:09:24 07:51:59 - Data/horário de início
  • End Date: 2026:09:24 07:59:19 - Data/horário do fim

Movendo com Clamscan e Clamdscan

   O Clamonacc, dependendo das configurações, pode bloquear o Clamscan e o Clamdscan, então, por via das dúvidas, é de bom tom parar o Clamonacc para a varredura e iniciar logo após:
sudo sv stop clamonacc
ok: down: clamonacc: 0s, normally up

   Para o Clamscan e o Clamdscan moverem os arquivos para a quarentena, o parâmetro --move=/caminho/quarentena deve ser passado no comando para varreduras manuais e também colocado no Cron para varreduras automáticas:
sudo clamdscan --stream --move=/var/opt/clamav-quarentena ~/Downloads/eicar.com
Senha:
/home/usuario/Downloads/eicar.com: {HEX}test.test.eicar.1040.UNOFFICIAL FOUND
/home/usuario/Downloads/eicar.com: moved to '/var/opt/clamav-quarentena/eicar.com.008'

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 0.010 sec (0 m 0 s)
Start Date: 2026:09:21 13:34:29
End Date: 2026:09:21 13:34:29

cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Arquivo ou diretório inexistente

sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
sudo clamscan --move=/var/opt/clamav-quarentena ~/Downloads/eicar.com
Loading: 9s, ETA: 0s [========================>] 3.80M/3.80M sigs
Compiling: 3s, ETA: 0s [========================>] 42/42 tasks

/home/usuario/Downloads/eicar.com: {HEX}test.test.eicar.1040.UNOFFICIAL FOUND
/home/usuario/Downloads/eicar.com: moved to '/var/opt/clamav-quarentena/eicar.com.009'

----------- SCAN SUMMARY -----------
Known viruses: 3796968
Engine version: 1.5.3
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 69 B
Data read: 69 B (ratio 1.00:1)
Time: 12.660 sec (0 m 12 s)
Start Date: 2026:09:21 13:41:29
End Date: 2026:09:21 13:41:41

cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Arquivo ou diretório inexistente

Códigos de retorno do ClamAV: 0 = limpo, 1 = infectado, 2 = erro
sudo sv start clamonacc
ok: run: clamonacc: (pid 15645) 0s


Sobre o Clamonacc

   Recomendo utilizar o Clamonacc somente em algumas pastas como /home/usuario/Downloads, /tmp, /var/tmp e /dev/shm e mesmo assim, com cautela, pois pode acontecer de processos perderem o acesso aos arquivos necessários para seu funcionamento caso forem detectados como falsos positivos. Daí você terá de movê-los manualmente para a lista.

   O Clamonacc exige privilégios elevados (root) para interagir com a API fanotify do Kernel.

   Dar permissão de leitura global (o+rx) na pasta /home/usuario permite que outros usuários locais vejam a lista de arquivos públicos na sua home, isso não é recomendado, pois é uma preocupação de privacidade e segurança. A alternativa seria adicionar o usuário _clamav ao grupo de usuário pessoal e ajustar a opção AllowSupplementaryGroups no clamd.conf.

   De acordo com os testes mostrados, vimos que como o Clamonacc, dependendo das configurações, pode bloquear o Clamscan e o Clamdscan, então, por via das dúvidas, pararamos o Clamonacc para a varredura e iniciamos logo após.


Diferenças entre Clamscan e Clamdscan

   Clamd/Clamonacc: Usam obrigatoriamente o /etc/clamd.conf. O daemon fica rodando em segundo plano na memória, mantendo o banco de dados carregado para responder instantaneamente. É ideal para o monitoramento leve em tempo real em pastas específicas.

   Como o banco de dados de vírus já está carregado na RAM pelo daemon (Clamd), o Clamdscan é imensamente mais rápido para iniciar e consome muito menos CPU a cada execução. Ele apenas envia o caminho do arquivo para o daemon analisar e devolve o resultado.

   O Clamdscan é mais recomendado para varreduras manuais em arquivos e diretórios específicos.

   Por exemplo, quando tiver um arquivo muito grande para escanear, altere o /etc/clamd.conf em OnAccessMaxFileSize XXXM e depois rode o echo 'fs.inotify.max_user_watches=xxxxxxxxx' | sudo tee /etc/sysctl.d/99-inotify.conf com o mesmo tamanho convertido em bytes. Depois retorne ao tamanho padrão das tuas necessidades para o Clamonacc não interferir no sistema. No meu caso eu deixo em 100 megas (100M).

   Clamscan: É um utilitário avulso. Ele lê o banco de dados de assinaturas diretamente do disco a cada execução. Como ele varre sob demanda (via cron ou manualmente), ele não interfere no comportamento do Clamonacc e não exige que altere o arquivo /etc/clamd.conf.

   A cada execução, ele precisa ler todos os arquivos de assinatura do banco de dados diretamente do disco e alocar tudo na RAM novamente, o que consome bastante tempo e picos de processamento.

   Porém, em uma varredura automática pelo Cron de madrugada no sistema inteiro, o Clamscan é o ideal.


  Wrapper é uma função, classe ou biblioteca que envolve um código existente para simplificar sua interface, adicionar novas funcionalidades ou adaptar sua comunicação.

  Arquivo configurado para fazer a varredura com o Clamscan, que depois será utilizado no Cron.
sudo vim /usr/local/bin/varredura.sh
Coloque dentro:
#!/usr/bin/env bash# /usr/local/bin/varredura.sh# Varredura completa com Clamscan, independente do Clamd/Clamonacc.# Uso: rodar como root via Cron. set -euo pipefail # -------------## Configuracao# -------------#ALVOS=(#  "/"#  "/home"#  "/var/www"#  "/etc"    "/home/seu_usuario/Downloads"#  Adicione mais diretorios aqui ou coloque para varrer o raiz (/) e adicione mais --exclude-dir abaixo) LOG="/var/log/varredura.log"QUARENTENA="/var/opt/clamav-quarentena"LOCKFILE="/var/run/clamscan.lock" # Evita rodar duas varreduras simultaneas se a anterior atrasarexec 200>"$LOCKFILE"if ! flock -n 200; then    echo "$(date '+%F %T') - Varredura anterior ainda em execução. Abortando." >> "$LOG"    exit 1fi echo "=================================================" >> "$LOG"echo "$(date '+%F %T') - Início da varredura" >> "$LOG" # --------------## Execucao# --------------#sudo sv stop clamonacc &&set +eclamscan \  --recursive \  --alert-broken \  --infected \  --log="$LOG" \  --move="$QUARENTENA" \  --exclude-dir='^/(proc|sys|dev|run|/var/run|/etc/sv|/etc/runit)' \  --exclude-dir='^/var/lib/_clamav' \  --exclude-dir='^/var/log' \  --max-filesize=500M \  --max-scansize=1000M \  --max-scantime=0 \  --cross-fs=no \  --alert-exceeds-max=yes \  --alert-broken=yes \  --alert-encrypted=yes \  --alert-macros=yes \  --detect-pua=yes \  "${ALVOS[@]}"STATUS=$?;set -e;sudo sv start clamonacc echo "$(date '+%F %T') - Fim da varredura (Código de saída: $STATUS)" >> "$LOG"# Codigos de retorno do ClamAV: 0 = limpo, 1 = infectado, 2 = erroexit $STATUS
Salve e saia.

   De acordo com os testes mostrados, vimos que como o Clamonacc bloqueia até o Clamscan e o Clamdscan, então temos que parar o Clamonacc para a varredura e iniciá-lo logo após, como está no script.
sudo chmod +x /usr/local/bin/varredura.sh
sudo chown _clamav:_clamav /usr/local/bin/varredura.sh

Arquivo lock:
sudo touch /var/run/clamscan.lock
sudo chown _clamav:_clamav /var/run/clamscan.lock
sudo chmod 750 /var/run/clamscan.lock

Crie o arquivo de log das varreduras:
sudo touch /var/log/varredura.log
sudo chown _clamav:_clamav /var/log/varredura.log
sudo chmod 640 /var/log/varredura.log

L
ogrotate
sudo vim /etc/logrotate.d/clamav
Acrescente /var/log/varredura.log:
/var/log/clamd.log /var/log/freshclam.log /var/log/varredura.log {    monthly    rotate 6    compress    delaycompress    missingok    notifempty    create 0640 _clamav _clamav    sharedscripts    postrotate        vsv reload clamd >/dev/null 2>&1 || true        vsv reload freshclam >/dev/null 2>&1 || true    endscript}
Salve e saia.

Verificando:
sudo logrotate -d /etc/logrotate.d/clamav
warning: logrotate in debug mode does nothing except printing debug messages! Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.d/clamav
Reading state from file: /var/lib/logrotate.status
Allocating hash table for state file, size 64 entries
Creating new state
Creating new state
Creating new state

Handling 1 logs

rotating pattern: /var/log/clamd.log /var/log/freshclam.log /var/log/varredura.log monthly empty log files are not rotated, (6 rotations), old logs are removed
considering log /var/log/clamd.log
Creating new state
Now: 2026-09-24 00:26
Last rotated at 2026-09-24 00:00
log does not need rotating (log has already been rotated)
considering log /var/log/freshclam.log
Creating new state
Now: 2026-09-24 00:26
Last rotated at 2026-09-24 00:00
log does not need rotating (log has already been rotated)
considering log /var/log/varredura.log
Creating new state
Now: 2026-09-24 00:26
Last rotated at 2026-09-24 00:00
log does not need rotating (log has already been rotated)
not running postrotate script, since no logs were rotated

   O parâmetro -d (modo debug) apenas imprime na tela tudo o que ele faria se estivesse rodando de verdade.

   Se você quer forçar a rotação dos logs agora mesmo, substitua o -d pelo parâmetro -f (force):
sudo logrotate -f /etc/logrotate.d/clamav
   Se você quer ver o que ele está fazendo em tempo real enquanto executa de verdade, use o modo detalhado -v (verbose):
sudo logrotate -v /etc/logrotate.d/clamav
Testando o arquivo no diretório /home/seu_usuario/Downloads:
sudo /usr/local/bin/varredura.sh
ok: down: clamonacc: 1894s, normally up

Em outro terminal execute:
ps aux | grep clamscan
root 1927 99.0 3.3 1294288 1100592 pts/1 R+ 00:30 0:12 clamscan --recursive --alert-broken --infected --log=/var/log/varredura.log --move=/var/opt/clamav-quarentena --exclude-dir=^/(proc|sys|dev|run|/var/run|/etc/sv|/etc/runit) --exclude-dir=^/var/lib/_clamav --exclude-dir=^/var/log --max-filesize=500M --max-scansize=1000M --max-scantime=0 --cross-fs=no --alert-exceeds-max=yes --alert-broken=yes --alert-encrypted=yes --alert-macros=yes --detect-pua=yes /home/kluster/Downloads
seu_usuario 1982 0.0 0.0 6704 2628 pts/2 S+ 00:30 0:00 grep clamscan
   A linha root indica que o escaneamento está ocorrendo com todos os parâmetros configurados no arquivo.
   Para parar tecle Ctrl+c.

   Agora vamos testar um único diretório para comprovar. Tenho um diretório ~/teste que sei que não tem vírus, vamos colocar o eicar para incrementar o teste:
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/teste/eicar.com
sudo vim /usr/local/bin/varredura.sh
Deixei essa parte assim, adapte para você:
# -------------------#
# Configuracao
# -------------------#
ALVOS=(
# "/"
# "/home"
# "/var/www"
# "/etc"
"/home/seu_usuario/teste"
# adicione mais diretorios aqui ou coloque para varrer o raiz (/) e adicione mais --exclude-dir abaixo
)

Salve e saia.
sudo /usr/local/bin/varredura.sh
ok: down: clamonacc: 1s, normally up
/home/kluster/teste/eicar.com: {HEX}test.test.eicar.1040.UNOFFICIAL FOUND
/home/kluster/teste/eicar.com: moved to '/var/opt/clamav-quarentena/eicar.com'

----------- SCAN SUMMARY -----------
Known viruses: 3811649
Engine version: 1.5.3
Scanned directories: 45
Scanned files: 576
Infected files: 1
Data scanned: 6.92 MiB
Data read: 5.87 MiB (ratio 1.18:1)
Time: 15.432 sec (0 m 15 s)
Start Date: 2026:09:23 15:12:44
End Date: 2026:09:23 15:12:59
ok: run: clamonacc: (pid 17328) 1s

cat ~/teste/eicar.com
cat: /home/usuario/teste/eicar.com: Arquivo ou diretório inexistente

Caso quiser dê um:
cat /var/log/varredura.log
ou
tail -n 10 /var/log/varredura.log
   E, para encerrar, confirme que o Clamonacc iniciou (apesar de a saída mostrar isso no final):
sudo sv status clamonacc
run: clamonacc: (pid 17328) 62s

Vemos que o teste final correu tudo bem.

   Escaneou os arquivos e pegou o eicar.com movendo-o para a quarentena e "ligando" o Clamonacc.

   Lembrando que é necessário desabilitar o Clamonacc durante as varreduras porque, como vimos, ele não deixa nem o Clamdscan e nem o Clamscan atuarem nos arquivos e diretórios protegidos.

   Pode deixar o Clamonacc habilitado durante as varreduras que somente não serão escaneados os diretórios e arquivos protegidos pelo Clamonacc, porém, eu prefiro desabilitar para evitar conflitos e possíveis problemas de travamentos porque, como vimos, o Clamonacc atua direto no Kernel.

   Depois, lembre de configurar ALVOS para raiz (/) no arquivo /usr/local/bin/varredura.sh e acrescente quantas exclusões quiser com o parâmetro --exclude-dir.

Códigos de retorno do ClamAV: 0 = limpo, 1 = infectado, 2 = erro


Abrindo o Cron:
sudo -E crontab -e
ou
sudo EDITOR=vim crontab -e
ou
sudo EDITOR=nano crontab -e
ou
configure o ~/.bashrc permanentemente, senão o comando "sudo crontab -e" abrirá o vi por padrão no Void e você nunca mais sairá dele.

Coloque dentro:

# === ClamAV === # 1. Atualiza o banco de dados as 03:22 todos os dias# Opcional porque o /etc/freshclam.conf está configurado para atualizar duas vezes ao dia: Checks 222 03 * * * runuser -u _clamav /usr/bin/freshclam # 2. Escaneia o sistema as 03:44 no domingo (0) e na quarta-feira (3)# 44 03 * * 0,3 sudo sv stop clamonacc && /usr/bin/clamdscan --stream --recursive --fdpass --exclude-dir="^/sys|^/dev|^/proc|^/etc/sv|^/etc/runit|/\.config/google-chrome" /; sudo sv start clamonacc # 3. Escaneia o sistema as 03:44 no domingo e na quarta44 03 * * 0,3 /usr/local/bin/varredura.sh >> /var/log/varredura.log 2>&1 # 4. Roda a cada 5 minutos (ou no intervalo que preferir)*/5 * * * * /usr/local/bin/monitor-quarentena.sh # 5. Limpa arquivos com mais de 30 dias na quarentena todo Sabado as 00:0000 00 * * 6 /usr/local/bin/limpar_quarentena.sh # === CLamAV Final ===
Salve e saia.

  Configure os dias e horários para quando o computador/servidor estiver ligado, ou seja, configure de acordo com as tuas necessidades.


TESTANDO O CRON
sudo -E crontab -e
Coloque uma linha assim:
25 15 * * * /usr/local/bin/varredura.sh >> /var/log/varredura.log 2>&1

   Ajuste para um horário perto, ali está para iniciar a varredura às 15:25 hs. Não dará mensagem nenhuma no terminal.

Aguarde terminar e veja o log:
sudo tail -n 5 /var/log/varredura.log
Time: 15.479 sec (0 m 15 s)
Start Date: 2026:09:23 15:25:00
End Date: 2026:09:23 15:25:16
ok: run: clamonacc: (pid 19885) 0s 2026-09-23 15:25:16 - Fim da varredura (código de saída: 1)


   Veja que iniciou às 15:25:00.
   E se você configurou também o monitor-quarentena.sh no Cron, deverá ver a mensagem na tela (Notify-send ou Zenity).



Para remover completamente:

$ sudo sv stop clamd
$ sudo sv stop clamonacc
$ sudo xbps-remove clamav
$ sudo userdel _clamav
$ sudo groupdel _clamav
$ sudo umount /var/opt/clamav-quarentena
$ sudo rm -rf /var/opt/clamav-quarentena
Não esqueça de comentar ou apagar a linha no /etc/fstab:
$ sudo vim /etc/fstab
$ sudo rm -rf /var/log/freshclam.log
$ sudo rm -rf /var/log/clamd.log
$ sudo rm -rf /var/run/clamav
$ sudo rm /var/service/clamd
$ sudo rm -rf /etc/sv/clamd
$ sudo rm /var/service/clamonacc
$ sudo rm -rf /etc/sv/clamonacc
$ sudo rm -rf /etc/logrotate.d/clamav-quarentena
$ sudo rm -rf /run/runit/supervise.clamd
$ sudo rm -rf /run/runit/supervise.clamd-log

Opcional:
$ sudo rm -rf /etc/freshclam.conf
$ sudo rm -rf /etc/clamd.conf
$ sudo rm -rf /etc/clamav-milter.conf
$ sudo rm -rf /usr/local/bin/limpar-quarentena.sh
$ sudo rm -rf /usr/local/bin/monitor-quarentena.sh


AVISO IMPORTANTE
   Não utilize proteção recursiva com o Clamonacc (proteção em tempo real), pois ele praticamente deixará o sistema lento, podendo travar o sistema.

Pode ter múltiplos parâmetros OnAccessIncludePath:
OnAccessPrevention yes
OnAccessDisableDDD yes
OnAccessIncludePath /home
OnAccessIncludePath /home/usuario
OnAccessIncludePath /home/usuario/Downloads
OnAccessIncludePath /home/usuario/Downloads/pasta
   A configuração acima resultará na proteção não recursiva em tempo real dos diretórios, ou seja, o parâmetro "OnAccessIncludePath /home/usuario" somente protegerá em tempo real os arquivos que ali estiverem, mas não protegerá os diretórios (pastas) dentro de /home/usuario. Quaisquer tentativas de acesso detectadas pelo Clamonacc em arquivos maliciosos dentro de /home/usuario serão bloqueadas pelo Kernel através do fanotify, como veremos nos testes mais adiante.

   Para o tipo de proteção com bloqueio automático, os parâmetros básicos a serem habilitados são os seguintes:
OnAccessIncludePath /home/usuario/pasta
OnAccessExcludeUname clamav
OnAccessPrevention yes
OnAccessDisableDDD yes
   Com "OnAccessPrevention yes", ao tentar acessar um arquivo malicioso com, por exemplo, cat eicar.com, o ClamAV através do fanotify do Kernel emitirá uma notificação:
cat eicar.com
cat: eicar.com: Operação não permitida

   Com "OnAccessPrevention no", ao tentar acessar um arquivo malicioso, o acesso será permitido.

   Coloquei "OnAccessDisableDDD yes" porque o DDD falha em aplicar as marcações do Kernel recursivamente para diretórios que já existiam antes do serviço iniciar, então, para evitar conflitos, é melhor desabilitar e colocar as pastas que você quer que tenham bloqueio imediato.

   De qualquer maneira, você deverá ter um script para mover os arquivos infectados para a quarentena ou utilizar o parâmetro "--move=/caminho/quarentena", pois o ClamAV não faz esse tipo de controle.

   Clamscan, Clamonacc e Clamdscan incluem a opção "--remove" para excluir qualquer arquivo que gere alertas durante uma verificação. Isso geralmente é uma péssima ideia, a menos que você esteja monitorando um diretório de uploads/downloads. Falsos positivos acontecem! Você não quer que o arquivo errado seja excluído acidentalmente. Em vez disso, considere usar o parâmetro "--move" ou talvez apenas "--copy" e configure um script com o recurso "VirusEvent" para notificá-lo quando algo for detectado.


CASO 0x0


   Caso o usuário precise monitorar todo o sistema de arquivos, mas bloquear tentativas de acesso maliciosas não é uma preocupação:
OnAccessMountPath /
OnAccessExcludeRootUID yes
OnAccessExcludeUname clamav

   Essa configuração ativará o On-Access Scanner notify-only (apenas notificação). Ela também garantirá que apenas processos de usuário que não sejam root nem clamav, acionem verificações no sistema de arquivos. Os processos iniciados pelo root e pelo usuário do ClamAV (_clamav ou clamav) não acionarão verificações e, por conseguinte, notificações, ou seja, o ClamAV fará nada. Muitas vezes isso é necessário para evitar um loop em processos do root e/ou do usuário do ClamAV.

   Para mover os arquivos infectados para a quarentena e limpar a quarentena depois de um certo tempo, faz-se necessário um script, como veremos.

   O parâmetro OnAccessMountPath utiliza uma configuração de API fanotify diferente, o que o torna incompatível com OnAccessIncludePath e com o sistema DDD. Isso também significa que as seguintes opções não podem ser usadas em conjunto com OnAccessMountPath:

    • OnAccessExtraScanning - é construído em torno da captura de eventos inotify.
    • OnAccessExcludePath - é baseado no Sistema DDD.
    • OnAccessPrevention - trava o sistema se fosse selecionado para OnAccessMountPath.

   Se você precisar de OnAccessPrevention yes, use OnAccessIncludePath e OnAccessExcludePath.


CASO 0x1

   Caso o administrador do sistema precise monitorar o diretório pessoal de vários usuários, mas não de todos e não é necessário bloquear tentativas de acesso, mas somente notificar:
OnAccessIncludePath /home
OnAccessExcludePath /home/usario2
OnAccessExcludePath /home/usuario4
OnAccessExcludeUname clamav
   Com essa configuração, o On-Access Scanner monitorará recursivamente todo o diretório /home no modo notify-only, ou seja, somente notificação. Os diretórios /home/usuario2 e /home/usuario4 ficarão recursivamente fora da verificação.

   Para mover os arquivos infectados para a quarentena e limpar a quarentena depois de um certo tempo, faz-se necessário um script, como vimos.

Observação:
"OnAccessIncludePath /", ou seja, "OnAccessIncludePath" na raiz, NÃO é aceito como um parâmetro válido!



ClamAV no Linux

Verificando a configuração do kernel para a presença do fanotify:
cat /boot/config-`uname -r` | grep FANOTIFY
Atualizando e instalando:
sudo xbps-install -Syu
sudo xbps-install clamav
Verifique se o usuário e o grupo do ClamAV foram criados:
cut -d: -f1 /etc/passwd
cut -d: -f1 /etc/group
   Caso não tenha sido criado na tua distribuição, crie o usuário (no Void, ao instalar o ClamAV, o usuário e o grupo _clamav são criados automaticamente, então pode pular esses dois comandos):
sudo groupadd _clamav
sudo useradd -g _clamav -s /bin/false -c "Clam Antivirus" _clamav
   Se o seu sistema operacional não tiver os utilitários groupadd e useradd, instale-os.

Vamos remover a extensão do arquivo:
cd /etcsudo mv clamav-milter.conf.sample clamav-milter.confcd
Criando diretório para o soquete local e permissionando (verifique o nome correto de usuário):
sudo mkdir -p /var/run/clamav
sudo chown -R _clamav:_clamav /var/run/clamav && sudo chmod -R 750 /var/run/clamav

Fazendo Arquivos de Log

Para o Freshclam:
sudo touch /var/log/freshclam.logsudo chown _clamav:_clamav /var/log/freshclam.logsudo chmod 640 /var/log/freshclam.log
Para o Clamd:
sudo touch /var/log/clamd.log && sudo chown _clamav:_clamav /var/log/clamd.log && sudo chmod 640 /var/log/clamd.log
Colocando o diretório database com o dono correto (verifique se é _clamav ou clamav):
sudo chown -R _clamav:_clamav /var/lib/_clamav
sudo vim /etc/freshclam.conf
Veja artigo.
sudo vim /etc/clamd.conf
Veja artigo.
sudo echo 'fs.inotify.max_user_watches=104857600' | sudo tee /etc/sysctl.d/99-inotify.conf

AVISO
   O número ali são 100M convertidos em bytes. Esse número deve ser o mesmo do parâmetro OnAccessMaxFileSize. Caso você mudar o número do parâmetro OnAccessMaxFileSize deve executar esse comando novamente com o novo número.


QUARENTENA

Criando diretório e arquivo e permissionando:
sudo mkdir -p /var/opt/clamav-quarentenasudo touch /var/opt/clamav-quarentena/quarentena.logsudo chown -R _clamav:_clamav /var/opt/clamav-quarentenasudo chmod 700 /var/opt/clamav-quarentenasudo chmod 664 /var/opt/clamav-quarentena/quarentena.log
sudo vim /etc/fstab
   Adicione a seguinte linha no final para aplicar restrições estritas de segurança (noexec, nosuid e nodev impedem a execução de programas, binários SUID e criação de dispositivos):

...
/var/opt/clamav-quarentena /var/opt/clamav-quarentena none bind,noexec,nosuid,nodev 0 0

Montando imediatamente:
sudo mount -a
sudo vim /usr/local/bin/limpar-quarentena.sh
Veja artigo.

Permissionando:

sudo chmod +x /usr/local/bin/limpar-quarentena.sh && sudo chown _clamav:_clamav /usr/local/bin/limpar-quarentena.sh
sudo vim /usr/local/bin/monitor-quarentena.sh
Veja artigo.

Permissionando:

sudo chmod +x /usr/local/bin/monitor-quarentena.sh && sudo chown _clamav:_clamav /usr/local/bin/monitor-quarentena.sh
sudo ls -la /var/opt/clamav-quarentena
sudo vim /usr/local/bin/notificar-virus.sh
Veja artigo.
sudo chmod +x /usr/local/bin/notificar-virus.sh && sudo chown _clamav:_clamav /usr/local/bin/notificar-virus.sh

Logrotate
sudo xbps-install -S logrotatesudo vim /etc/logrotate.d/clamav-quarentena
Veja artigo.
sudo logrotate -d /etc/logrotate.d/clamav-quarentena
sudo vim /etc/logrotate.d/clamav
Veja artigo.
sudo logrotate -d /etc/logrotate.d/clamav

Atualizando banco de dados:
sudo ln -s /etc/sv/clamd /var/service/
sudo sv start clamd
sudo -u _clamav freshclam
ou
sudo -u clamav freshclam
sudo sv start clamd
Caso quiser pode executar novamente:
sudo -u _clamav freshclam
sudo ls -la /var/run/clamav/

Clamonacc
sudo mkdir -p /etc/sv/clamonaccsudo vim /etc/sv/clamonacc/run
Veja artigo.
sudo chmod +x /etc/sv/clamonacc/runsudo ln -s /etc/sv/clamonacc /var/service/sudo sv start clamonacc
Testando
echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
bash: /home/usuario/Downloads/eicar.com: Operação não permitida

   Isso deve acontecer porque no arquivo /etc/clamd.conf o caminho /home/usuario/Downloads está no OnAccessIncludePath.

Faremos com sudo:
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
Tentando ler o arquivo:
cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Operação não permitida
sudo cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Arquivo ou diretório inexistente

Perceba que o arquivo foi movido para a quarentena:
sudo ls -la /var/opt/clamav-quarentena
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
sudo cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Operação não permitida
sudo cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Arquivo ou diretório inexistente
sudo ls -la /var/opt/clamav-quarentena
sudo cat /var/opt/clamav-quarentena/quarentena.log

Testando Escaneamento
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
sudo clamscan ~/Downloads/eicar.com
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
sudo clamdscan --stream ~/Downloads/eicar.com
   Podemos ver que o clamonacc (Proteção em Tempo Real) não deixa nem o clascam e nem o clamdscan acessarem o arquivo virulento, nem com sudo e nem com o próprio usuário _clamav (ou clamav).

   Vamos comentar o diretório /home/usuario/Downloads no arquivo:
sudo vim /etc/clamd.conf

Comente

#OnAccessIncludePath /home/usuario/Downloads

sudo sv restart clamd
sudo sv restart clamonacc
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
sudo clamscan ~/Downloads/eicar.com
cat ~/Downloads/eicar.com
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

   Obs.: Para o arquivo ser movido para a quarentena, o parâmetro "--move=/caminho/quarentena" deve ser passado no comando, como veremos logo adiante.
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
sudo clamdscan --stream ~/Downloads/eicar.com
sudo clamscan ~/Downloads/
sudo clamdscan --stream --move=/var/opt/clamav-quarentena ~/Downloads/eicar.com
cat ~/Downloads/eicar.com
cat: /home/usuario/Downloads/eicar.com: Arquivo ou diretório inexistente
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com
sudo clamscan --move=/var/opt/clamav-quarentena ~/Downloads/eicar.com
cat ~/Downloads/eicar.com

cat: /home/usuario/Downloads/eicar.com: Arquivo ou diretório inexistente


Wrapper Clamscan

sudo vim /usr/local/bin/varredura.sh
Veja artigo.
sudo chown -R _clamav:_clamav /usr/local/bin/varredura.sh
Crie o arquivo de log das varreduras:
sudo touch /var/log/varredura.log
sudo chown _clamav:_clamav /var/log/varredura.log
sudo vim /etc/logrotate.d/clamav
Veja artigo.

Verificando:
sudo logrotate -d /etc/logrotate.d/clamav
   O parâmetro -d (modo debug) apenas imprime na tela tudo o que ele faria se estivesse rodando de verdade.

   Se você quer forçar a rotação dos logs agora mesmo, substitua o -d pelo parâmetro -f (force):
sudo logrotate -f /etc/logrotate.d/clamav
Se você quer ver o que ele está fazendo em tempo real enquanto executa de verdade, use o modo detalhado -v (verbose):
sudo logrotate -v /etc/logrotate.d/clamav
Testando o arquivo:
sudo /usr/local/bin/varredura.sh
ok: down: clamonacc: 1894s, normally up

Em outro terminal execute:
ps aux | grep clamscan

   Agora vamos testar um único diretório para comprovar.

   Tenho um diretório em ~/teste que sei que não tem vírus, vamos colocar o eicar para incrementar o teste:
sudo echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/teste/eicar.com
sudo vim /usr/local/bin/varredura.sh
Deixei essa parte assim, adapte para você:
# -------------------#
# Configuracao
# -------------------#
ALVOS=(
# "/"
# "/home"
# "/var/www"
# "/etc"
"/home/seu_usuario/teste"
# adicione mais diretorios aqui ou coloque para varrer o raiz (/) e adicione mais --exclude-dir abaixo
)

sudo /usr/local/bin/varredura.sh
cat ~/teste/eicar.com
cat: /home/usuario/teste/eicar.com: Arquivo ou diretório inexistente

Caso quiser dê:
cat /var/log/varredura.log
tail -n 10 /var/log/varredura.log


CRON
sudo -E crontab -e
ou
sudo EDITOR=vim crontab -e
ou
sudo EDITOR=nano crontab -e
ou
configure o ~/.bashrc permanentemente, senão o comando sudo crontab -e abrirá o vi por padrão no Void e você nunca mais sairá dele.


Para remover completamente:
sudo sv stop clamdsudo sv stop clamonaccsudo xbps-remove clamavsudo userdel _clamavsudo groupdel _clamavsudo umount /var/opt/clamav-quarentenasudo rm -rf /var/opt/clamav-quarentena
Não esqueça de comentar ou apagar a linha no /etc/fstab:
sudo vim /etc/fstab
sudo rm -rf /var/log/freshclam.logsudo rm -rf /var/log/clamd.logsudo rm -rf /var/run/clamavsudo rm /var/service/clamdsudo rm -rf /etc/sv/clamdsudo rm /var/service/clamonaccsudo rm -rf /etc/sv/clamonaccsudo rm -rf /etc/logrotate.d/clamav-quarentenasudo rm -rf /run/runit/supervise.clamdsudo rm -rf /run/runit/supervise.clamd-log
Opcional:
sudo rm -rf /etc/freshclam.confsudo rm -rf /etc/clamd.confsudo rm -rf /etc/clamav-milter.confsudo rm -rf /usr/local/bin/limpar-quarentena.shsudo rm -rf /usr/local/bin/monitor-quarentena.sh


Como vimos, não é difícil, mas é trabalhoso.

Em pouco tempo pega-se o jeito.

HTOP

Basta pressionar a tecla Shift + O e digitar COMMAND=clamonacc para filtrar apenas pelo processo, ou procurar por clamonacc na lista.


Comandos Úteis:
sudo find /var/opt/clamav-quarentena/ -type f -name ".clamav-quarantine-lock.*" -delete
tail -f /var/log/clamd.logsudo ls -la /var/run/clamav/sudo ls -la /var/log/clamav-quarentenasudo ss -lpx | grep clamdsudo ss -lpt | grep clamdgrep -E "^LocalSocket|^TCPSocket" /etc/clamd.confecho 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/Downloads/eicar.com; echo "Status: $?"
cut -d: -f1 /etc/passwdcut -d: -f1 /etc/groupgetent passwd | awk -F: '{print $1 " (UID: " $3 ") -> " $6}'
Para ver se a base de dados está na versão mais recente:
sigtool --info /var/lib/_clamav/main.cvd
File: /var/lib/_clamav/main.cvd
Build time: 16 Dec 2025 23:18 +0000
Version: 63
Signatures: 3287027
Functionality level: 90
Builder: tomjudge
MD5: 9c353a6b32555186a45a61c6441f38c0
Digital signature: gI9w3cezaElJbedEoiykyQeX1f6j9Xbs3a+cf9U/kH5QScGMe2mRz1K2JlYOrqfBuOUMbiKmvkVvAquOsMeDp/ejLVDx5WulC6klZVhLOfBHda29OjaLZwEGR9GPIHDr0mXriv7pivuMH60/loxpASIJHLOszyj95pxVK+EaTCh
Verification OK.

Ou
sudo sigtool --info /var/lib/_clamav/daily.cld
File: /var/lib/_clamav/daily.cld
Build time: 23 Sep 2026 06:24 +0000
Version: 28132
Signatures: 355666
Functionality level: 90
Builder: svc.clamav-publisher
Verification OK.


   O arquivo main.cvd é a base principal de assinaturas estáveis do ClamAV e é atualizado muito raramente (geralmente uma ou duas vezes por ano). A versão atual e mais recente globalmente é justamente a Versão 63, gerada pelo desenvolvedor tomjudge em 16 de dezembro de 2025 contendo as 3.287.027 assinaturas listadas na saída.

   O main.cvd continuará estático na versão 63 por algum tempo, enquanto o daily.cld mudará de versão e trará a data do dia atual toda vez que se rodar o Freshclam.

   O script de quarentena está operando sobre uma base de dados totalmente atualizada.

   Lembrando que as atualizações do Freshclam ocorrem automaticamente 2 vezes por dia conforme o parâmetro Checks 2 no arquivo /etc/freshclam.conf e uma terceira vez no dia se tu colocou no Cron.

   Quando ocorrem atualizações diárias, o Freshclam modifica apenas o arquivo daily.cvd (ou daily.cld).


Principais arquivos de banco de dados:

  • main.cvd: O banco estático principal.
  • daily.cvd (ou daily.cld): Este sim muda múltiplas vezes ao dia para incluir ameaças recentes (Ransomwares, Phishing e malwares novos).
  • bytecode.cvd: Atualizado esporadicamente para novas lógicas do motor de varredura.

Diretórios Temporários: (Os alvos nº 1) Estes são os locais mais comuns porque qualquer usuário do sistema (ou serviço web vulnerável, como um site em WordPress ou uma aplicação PHP) tem permissão total para gravar arquivos neles.
/tmp: O diretório temporário global. Praticamente 90% dos scripts automatizados de ataque (como mineradores de criptomoedas e bots de DDoS) fazem o download de seus binários aqui antes de executá-los.
/var/tmp: Semelhante ao /tmp, mas os arquivos aqui não são apagados quando o sistema reinicia. Atacantes usam este local para tentar manter persistência no servidor.
/dev/shm: Este é o diretório de memória compartilhada (Shared Memory). Arquivos colocados aqui rodam direto na memória RAM, o que os torna extremamente rápidos e, muitas vezes, invisíveis para ferramentas tradicionais de monitoramento de disco.

2)
Diretórios de Serviços Web e Uploads: Se o seu Linux roda um servidor web (Apache, Nginx) ou bancos de dados, o atacante explorará falhas na aplicação para injetar arquivos (geralmente Web Shells em PHP, Python ou Perl).
/var/www/html/ (ou subpastas de uploads como wp-content/uploads no WordPress): Onde códigos maliciosos são injetados para que o atacante possa controlar o servidor remotamente pelo navegador.
/var/spool/samba/ ou pastas de compartilhamento de rede: Se o Samba estiver mal configurado, malwares de Windows (como Ransomwares) podem ser depositados ali para infectar outros computadores da rede.

3)
Diretórios Ocultos nos Perfis de Usuários (/home): Quando o ataque visa especificamente a conta de um usuário (via roubo de senha SSH ou chave privada), os binários maliciosos costumam ser escondidos dentro de pastas ocultas na /home para evitar detecção visual simples (comandos ls comuns não as mostram).
/home/usuario/.config/ ou /home/usuario/.local/: Pastas legítimas onde malwares se disfarçam de arquivos de configuração do sistema.
/home/usuario/.ssh/: Embora não coloquem o malware aqui, os atacantes injetam chaves públicas no arquivo authorized_keys desta pasta para garantir que possam reentrar no sistema quando quiserem, sem precisar de senha.

quinta-feira, 17 de setembro de 2026

Bolsonaro, o Feministo de Esquerda - Lula, o Sapo Barbudo de Direita


   O número de medidas protetivas de urgência aumentou em todo o Brasil, mantendo recordes históricos em 2026, e todas elas sempre contra o homem. Dificilmente você verá um juiz dando uma medida protetiva tirando uma mulher de casa, mesmo ela tendo culpa provada.

   Esse aumento expressivo começou a se acentuar a partir do ano de 2020, que marca o início da série histórica oficial monitorada pelo Conselho Nacional de Justiça (CNJ). 

   Em 2020 o Brasil registrou 338.398 medidas protetivas concedidas. No início daquele ano, a média nacional ficava em torno de 20 mil a 28 mil concessões por mês. E, partir de 2020, a coisa não parou de crescer, batendo recorde histórico em 2024: 851.958 medidas protetivas, consolidando um aumento acumulado de mais de 150% em quatro anos.

   Em 2019, o então presidente Bolsonaro havia sancionado a lei que permite ao policial afastar agressor da mulher sem aval da Justiça, a Lei 13.827/19. Na época, foi avisado que Bolsonaro estava levando o feminismo ao único lugar onde ele ainda não havia chegado: o interior do Brasil.

   A então ministra Damares Alves, comemorou, com orgulho, no antigo Twitter, ter aprovado 15 leis de "proteção à mulher" em um ano e meio de governo Bolsonaro, enquanto que o PT, em 13 anos, aprovou somente 14. Como se Leis fossem uma questão quantitativa e não qualitativa. Desde então, a coisa não parou de crescer. Somente em 2025, 19 novas leis ampliaram a "proteção às mulheres".

   Aliás, "proteção à mulher" é uma linguagem peculiar utilizada tanto por aquilo que chamam de esquerda quanto por aquilo que chamam de direita no Brasil. Na verdade, são leis feministas.

   Engraçado é que quanto mais leis de "proteção à mulher" são aprovadas, mais aumenta a violência contra a mulher (agora chamada de "violência doméstica"). Esse linguajar avança num progressismo conservador retrógrado circundante.
   Eles mesmos dizem que a violência contra a mulher não pára de crescer, então precisamos de mais leis porque a violência contra a mulher não pára de crescer então precisamos de mais leis porque a violência contra a mulher não pára de crescer então precisamos de mais leis...
   Das duas, uma: ou essas leis são inócuas ou são elas que promovem a violência contra a mulher; não há terceira opção nesse caso!

   É uma indústria ideológica que culmina em leis que moldam o comportamento da sociedade. Como bem disse Miguel Reale: "o Direito tutela comportamentos humanos".

   A então ministra Damares, de imediato, mudou o nome do Ministério dos Direitos Humanos para Ministério da Mulher, Família e Direitos Humanos, ou seja, em primeiríssimo lugar, a mulher, em segundo, mais lá atrás, a família alternativa e, por último, se sobrar tempo, os direitos humanos.

   O homem brasileiro já perdeu a presunção de inocência faz anos - presunção de inocência juridicamente falando, aquela no artigo 5º, inciso LVII, de uma coisa chamada Constituição Federal. O ônus da prova é da acusação. O Ministério Público ou o autor da denúncia precisa apresentar provas reais e fortes da culpa: a fala da mulher.

   A sociedade brasileira é uma sociedade muçulmana às avessas: lá, a mulher tem nenhum valor legal, aqui, o homem tem nenhum valor legal. De qualquer maneira, temos sociedades disfuncionais; lutas de classes por atacado, metade da população contra a outra metade.

   O mais estranho é que o Bolsonaro é hoje o representante da extremíssima-direita, do fascismo, do machismo, etc.
   Os quatro anos de governo Bolsonaro foram o governo mais à esquerda que o Brasil já teve. Bolsas disso, bolsas daquilo, décimo-terceiro de bolsas, leis feministas, lei de controle de natalidade e por aí vai.
   Leis favorecendo o armamento da população: nenhuma!
   Lembrando que essa era uma pauta fortíssima de campanha.
   O Lula já era mentiroso e oportunista, mas o Bolsonaro elevou a mendacidade e o oportunismo a níveis exosféricos.

      Segundo a própria Michele Bolsonaro, em 2022, o governo Bolsonaro tinha aprovado 70 leis de "proteção à mulher" e pretendia aprovar 100. Mas era mentira: de acordo com levantamento feito pelo Estadão, Bolsonaro sancionou 46 projetos.

   Vejamos. Mesmo sendo 46 leis em 4 anos, quanto tempo leva para fazer, protocolar e aprovar uma lei?
   Redigir o texto pensadamente, encaminhar ao protocolo, seguir os trâmites, vai e volta da Câmara de Deputados para o Senado e vice-versa, diversas comissões (CCJ, CFT, CDH, etc)... até sua aprovação.
   Em 4 anos o governo Bolsonaro fez isso 46 vezes. Dentro de qual ministério tinha um gabinete inteiro para fabricar e aprovar leis feministas?
   Leis favorecendo o armamento da população: nenhuma!

   O representante da extremíssima-direita falava bem de Hugo Chaves querendo que ele implantasse o socialismo no Brasil; sempre foi a favor do controle de natalidade (pauta de extremíssima-esquerda) - inclusive sancionou em 2022, quase seu último ato antes de deixar o poder, a Lei 14.443/2022, que reduziu de 25 para 21 anos a idade mínima para a realização de laqueadura e vasectomia e decretou o fim do consentimento do cônjuge no Brasil.
   Agora pode fazer laqueadura ou vasectomia mesmo que o cônjuge queira mais filhos acarretando em discussão e, talvez, separação do casal. Pau no cu do cônjuge.
   É destruição da família que chama?

   Bolsonaro, Deputado Federal por 28 anos, pedia que o presidente Lula desse 1 milhão para laqueaduras e vasectomias porque não tinha espaço para ele sentar na praia, palavras do Bolsonaro.
   O representante máximo da extremíssima-direita, religioso até a medula, agindo contra o que há de mais sagrado: ter filhos.
   Que eu saiba é "Ide e procriai-vos" e não "Ide e sentai-vos numa praia"..

   O representante da extremíssima-direita era um capitão sindicalista dentro dos quartéis que, literalmente, panfletava contra os baixos salários na época. Distribuía panfletos para os colegas de farda e recrutava asseclas.

   O representante máximo da extremíssima-direita afirmava respostas feministos dizendo que aborto deve ser uma decisão do casal, mas depois dizia: "ela decidiu ter o filho".

   O representante da extremíssima-direita era e é contra o fim das mordomias da classe política brasileira. Ele dizia em praça pública: "daí vou ter que pagar passagem do meu bolso, aí não dá", isso após ter elencado que os ganhos como Deputado chegavam a 130 mil por mês, durante a campanha para presidente de 2018. O cidadão assalariado tem de pagar passagem do próprio bolso.

   Em contra-partida, temos o Lula, hoje representante da extremíssima-esquerda, falava bem de Hitler, apoiava o armamento para a população e dizia que comunista é aquele mentiroso que vai te enganar e vai fazer você pensar que está te ajudando.

   O Sapo Barbudo, como Brizola alcunhou Lula, não colocou seus filhos para mamar diretamente nas tetas gordas do governo brasileiro. O sapo barbudo sempre deu seus pulos de forma diferente.

   Luiz Inácio Lula da Silva já afirmou pessoalmente ser contra o aborto, mas defende que o tema seja tratado pelo Estado como uma questão de saúde pública e em 2022, disse em um evento que "todo mundo deveria ter direito ao aborto".

   Em 2024 ele disse sobre o aborto: "Eu, Luiz Inácio Lula da Silva, fui casado, tive 5 filhos, 8 netos, e uma bisneta. Sou contra o aborto. Entretanto, como o aborto é a realidade, temos que tratar aborto com questão de saúde pública. É uma insanidade alguém querer punir uma mulher com pena maior que o criminoso que fez o estupro. É, no mínimo, uma insanidade".
   Uma no prego e outra na ferradura - é assim que se ferra uma população.

   O sapo barbudo, em 1989, teve sua primeira candidatura e foi ao segundo turno, mas perdeu para Fernando Collor de Mello, o filhote da ditadura.
   Em 1994 foi derrotado no primeiro turno por Fernando Henrique Cardoso, o melhor dos gramcistas.
   Em 1998 foi derrotado novamente no primeiro turno por Fernando Henrique Cardoso.
   Em 2002, venceu no segundo turno José Serra, o Zé Vizinho.
   Em 2006 foi reeleito ao vencer o Picolé de Chuchu no segundo turno.
   Em 2022, o Sapo Barbudo venceu o Feministo.

   O sapo barbudo é brasileiro e não desiste nunca!
   Somente um psicótico tem tanta sanha pelo poder.

   O Brasil é sui generis.

   A estupidez não deixa o brasileiro ver que o problema não é somente isso que chamam de políticos, estes saem da população, o problema é essa cultura da mentira e do fingimento.


quarta-feira, 26 de agosto de 2026

35 Anos de Linux

Em 25 de agosto de 2026 o Linux fez 35 anos de história!

O Linux completou 35 anos, provando que um projeto feito "só por hobby e que não seria grande" pode sim dominar o mundo (beijo, Linus Torvalds!).

Para comemorar, aqui está a radiografia definitiva dessa festa!

🥳 A Festa de Aniversário Geek

Linux: 35 Anos de Linux!

O bolo: Não tem sabor padrão; você precisa compilar os ingredientes e escolher sua própria interface de cobertura.

Os convidados: 99% dos supercomputadores do mundo, os servidores da NASA, bilhões de celulares Android e três gatos pingados usando o sistema no desktop.

O parabéns: Cantado em código binário com sotaque finlandês.

A treta: Uma discussão sem fim na mesa do bolo sobre qual distribuição é a melhor e por que o Windows é o verdadeiro "vilão" da história.

Mensagem original do Linus Torvalds na USENET em 25 de agosto de 1991:

Hello everybody out there using minix -

I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things).
I've currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I'll get something practical within a few months, and I'd like to know what features most people would want. Any suggestions are welcome, but I won't promise I'll implement them :-)
Linus (torv...@kruuna.helsinki.fi)
PS. Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT protable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(.

https://www.vivaolinux.com.br/noticia/35-anos-de-linux/

terça-feira, 25 de agosto de 2026

Ética e Moral - Nietzsche está Morto

 

   Vamos começar (eu e o leitor) com Mário Ferreira dos Santos no livro "Cristianismo: A religião do homem" e depois seguiremos com a "Genealogia da Moral" de Nietzsche.

   E não estamos falando de religião aqui, mas de Ética e Moral, uma das bases de toda Religião, da Filosofia e, por que não dizer, da vida!
   A partir do parágrafo 56, Mário começa a discorrer sobre o assunto - e não precisa se preocupar, não terá de contar os parágrafos, pois o livro foi escrito enumerado em parágrafos. Leia o livro todo, porém, caso quiser, vá direto a esse parágrafo 56.
   No parágrafo 59, Mário, em sua clareza costumeira, começa definindo etimologicamente: "...em grego, valor é axios e o homem é antrophos, daí chamarem a esses valores axioantropológicos".
   No parágrafo 60, Mário diz: "Os atos continuados constituem o costume (o que os gregos chamavam ethos e os latinos mos, moris, de onde vêm Ética e Moral)."
   A etimologia das palavras às vezes ajuda às vezes atrapalha; na maioria das vezes ajuda.
   Os atos éticos ou morais são atos que têm valor, porém, "valor" neste sentido refere-se à dignidade, não ao preço. Refere-se à categoria de Qualidade e não de Quantidade (Aristóteles), pois qualidade, nesta acepção, remete a "valor" e quantidade, nesta acepção, remete a preço.
   "Assim, toda vida prática do homem gira em torno da Ética."
   A partir do parágrafo 61, Mário começa a fazer a distinção entre Moral e Ética e diz que essa distinção não é arbitrária porque a Ética estuda o dever-ser humano e a Moral descreve e prescreve como se deve agir para realizar esse dever-ser.

   "A Moral é variante, mas a Ética é invariante."
   "Aqueles que dizem que a Ética é vária, porque a Moral é vária, confundiram a Moral com a Ética." Mário chama esses de "os detratores da Ética e da Moral" e diz que alguns fazem isso de propósito para obterem vantagens antiéticas, imorais e amorais.

   Mário nos diz, com base na realidade, no apodítico e na auto-evidência que a Ética deve ser consagrada ao universal.
   Por exemplo: matar é errado!... e ponto final. Todo ser humano sabe disso porque nasce sabendo disso, é um Princípio.
   Porém, caso eu matar em legítima defesa, é errado?
   Isso é uma discussão Moral.
   Dando um exemplo mais claro ainda: todo juri em que uma pessoa que matou alguém (homicídio) e é julgada pelas leis humanas, é uma discussão Moral, pois a Ética já foi infringida.
   Porém, por a Ética já ter sido infringida não significa que ela não é invariante, pois o termo "invariante" refere-se às leis divinas ou leis naturais, depende se você acredita ou não em Deus, mas tais leis são as mesmas: todo mundo sabe que matar é errado e mesmo tendo infringido o "não matar", o princípio continua sendo errado, mesmo que todo mundo faça.
   Daí vem o Direito Penal, Direito, Civil, Direito Natural, etc.
   E isso se aplica a não mentir, não roubar, não trair, etc.
   No Brasil, essa confusão é evidente e proposital feita pelos detratores da Ética e da Moral, como bem disse Mário.
   Confunde-se Ética com Moral, troca-se uma pela outra, não se sabe do que se está falando... vira uma confusão mental.
   Temos em empresas privadas e públicas, por exemplo, os tais "códigos de ética" (missão, valores, etc) que, na verdade, são códigos de moral porque permitem discussões; e não é uma simples questão de nominação porque a Ética é invariante (não enseja discussões) e a Moral é variante (enseja discussões).

   A Moral é a discussão em torno da Ética.

   Matar, mentir, roubar, trair, corromper, etc, todo ser humano sabe que isso é errado.
   As justificativas e desculpas que você dá do porquê você matou, traiu, mentiu, etc, são discussões Morais.
   E é necessário saber essa distinção, senão você não saberá distinguir entre uma e outra.
 
   Vamos imaginar que não exista Deus, que Ele seja uma invenção do ser humano, ou seja, teríamos certeza de que Deus não existe.
   Vamos imaginar que Moisés, o da Bíblia, quando subia ao Monte Sinai - segundo se sabe fez isso 8 vezes - para "falar" com Deus era tudo jogo de cena, Moisés subia para controlar o povo, sendo que naquela específica subida ao Monte Sinai na qual desceu com as Tábuas da Lei, inventou essa "estória" de um deus entalhando furiosamente as tábuas de pedra a raios e marteladas divinas no cinzel sagrado e sei-lá-mais-o-quê.

   Vamos mais além, vamos imaginar que a Bíblia inteira é uma alegoria, uma estória de ficção composta de várias estórias da carochinha. Vamos imaginar que os Dez Mandamentos sejam mesmo somente 10 e sejam, resumidamente (apesar das várias versões), os que se seguem:
1- Não ter outros deuses diante de mim.
2- Não tomar em vão o Nome do Senhor teu Deus.
3- Guarda o dia de sábado para santificar.
4- Honra teu pai e tua mãe.
5- Não matar.
6- Não pecar contra a castidade.
7- Não roubar.
8- Não mentir.
9- Não desejar a mulher do próximo.
10- Não cobiçar as coisas alheias.

   Independentemente de ter sido Deus ou Moisés quem entalhou as pedras, vamos analisar logicamente esses enunciados ou proposições ou imperativos... ou Mandamentos mesmo.

   Supondo que você não acredite que Deus exista e que você seja nada religioso, então podemos tirar os 3 primeiros da lista. Supondo que você não acredite que o Deus da Bíblia exista e que você seja um pouquinho religioso vamos tirar os 2 primeiros da lista porque você bem pode tirar o sábado (ou o domingo) para rezar para teu Deus, seja lá qual Ele for, para ir num balneário, ficar de folga com a natureza, ir à praia, ficar em casa fazendo nada, etc.

   Contudo, vamos analisar seguramente os outros 7 mandamentos que independem de você acreditar na existência de um ser supremo, de um Deus, de vários deuses, etc, independem até de você ser uma pessoa religiosa, espiritual, espirituosa, ateu, atéia, a toa, etc de novo.
   Vamos chamar esses 7 mandamentos agora de "Princípios Éticos". Vamos tomar o número 5, Não Matar, e analisar à luz da Filosofia.
   Sabe-se que "Princípio", em Filosofia, é aquilo que está no início e antes não precisa ter nada, nem mesmo uma explicação em palavras... pode até ter uma explicação em palavras, mas não se faz necessário.
   Todo mundo sabe que matar é errado em si, o ser humano nasce sabendo disso.
   Ética é, grosso modo, faça o certo e não faça o errado, tem de cumprir essas duas premissas ao mesmo tempo.
   Moral é a discussão em torno da Ética.
   Por exemplo, um Júri de homicídio é uma discussão Moral porque o Princípio Ético "Não Matar" já foi infringido, então, discutem-se as circunstâncias em torno disso. Mesmo você sendo ateu, religioso, etc, tudo é uma questão de Ética e Moral, simples assim.
   Na Moral, o ser humano discute e mente em torno dela. Legítima defesa, por exemplo: eu posso matar em defesa minha ou de terceiros? A resposta dessa pergunta vem de uma discussão Moral.
   Eu, vendo minha filha sendo estuprada, salvo ela e não mato o estuprador?
   "Não tenho sangue de barata", dirá você.
   Caso você seja uma pessoa essencialmente ética, você não matará em circunstância nenhuma.
   O único ser humano essencialmente Ético de quem se tem notícia foi Jesus Cristo, foi o único que cumpriu à risca os Mandamentos ou Princípios Éticos. É claro que Jesus não teve filha e, de bônus, fazia milagres, então a comparação foi, neste sentido, injusta, mas Jesus foi o único que conseguiu a façanha de Não matar, Não Mentir, etc. Pelo menos é o que se sabe.

   Nietzsche, em A Genealogia da Moral, passa dando alfinetadas no Cristianismo numa vã tentativa de combatê-lo, e apesar de terminar a vida louco no hospício - Nietzsche está morto e Deus está vivo - temos de concordar com ele em algumas partes.
   Na Primeira Dissertação ele levanta a questão entre "bom e ruim" e "bem e mau" e chega à conclusão de que esses dois valores contrapostos "travaram na terra uma luta terrível, milenar; e embora o segundo valor há muito predomine, ainda agora não faltam lugares em que a luta não foi decidida".
   O que nos interessa aqui é o que ele chama antes de "a moral dos escravos" que é pautada pela "moral dos senhores", pois aquela decorreu desta, baseada no ressentimento onde as fraquezas são transformadas em virtudes: "a impotência que não acerta contas é mudada em 'bondade'; a baixeza medrosa, em 'humildade'; a submissão àqueles que se odeia em 'obediência' (há alguém que dizem  impor essa submissão - chamam-no Deus). O que há de inofensivo no fraco, a própria covardia na qual é pródigo, seu aguardar-na-porta, seu inevitável ter-de-esperar, recebe aqui o bom nome de 'paciência', chama-se também a virtude; o não-poder-vingar-se chama-se não-querer-vingar-se, talvez mesmo perdão ('pois eles não sabem o que fazem - somente nós sabemos o que eles fazem!). Falam também do 'amor aos inimigos' - e suam ao falar disso." (página 38).
   "Os Judeus principiaram a revolta dos escravos na moral cuja rebelião tem atrás de si dois mil e tantos anos de história". Nietzsche confunde um pouco o Judaísmo com o Cristianismo, mas é compreensível, talvez fosse a insanidade já colocando as garras na mente dele. Brincadeiras à parte, o mundo atualmente parece-me baseado no ressentimento, na moral dos escravos, na mentira e no fingimento. O ser humano moderno é o ser humano do ressentimento. Ressentimento este que vem da estupidez de uma humanidade cada vez mais estupidificada.
   O que se pode concluir é que a "moral dos escravos" de Nietzsche é uma distorção da moral em si, "é algo próprio do ressentimento: a moral escrava sempre requer, para nascer, um mundo oposto e exterior, para poder agir em absoluto - sua ação é no fundo reação." Não posso deixar de lembrar nessa hora - não-sei-o-porquê - de Karl Marx e Engels e as "lutas de classes" que também são baseadas no ressentimento e na estupidez das massas.
   Por exemplo, entre o que chamam de Comunismo e o que chamam de Capitalismo, qual representa a moral dos escravos e qual representa a moral dos senhores?
   É somente uma mentira para manter uma luta ilusória entre duas entidades incorpóreas que tem nomes (signos) diferentes com o mesmo significado e o mesmo referente: concentração de dinheiro e poder nas mãos de poucas pessoas às custas da miséria e do sofrimento da maioria.

   Na Segunda Dissertação ele trata da "Culpa, má consciência e coisas afins".
   Na Terceira Dissertação: "O que significam ideais ascéticos?"

   Ética é isso: faça o certo e não faça o errado, Ética é Divina!
   Moral são as discussões em torno da Ética, Moral é do Ser Humano!




quinta-feira, 20 de agosto de 2026

Linux Kernel Version 7.2 Makes TSC Mandatory, Generating a Change in Philosophy


Any harm or mental instability resulting from poor translation, blame Google.

The Linux Kernel built its reputation, in part, on its efficiency on older machines that do not support modern operating systems like Windows 11. However, maintaining such extreme backward compatibility comes at a significant technical cost. The recent decision to mandate the TSC (Time Stamp Counter) on x86 processors demonstrates that maintainers have prioritized engineering evolution over the past. In practice, this means Linux has set aside nostalgia to focus on the technological performance of the future.

The latest version of the Linux Kernel (7.2, released on August 16, 2026) made the TSC a mandatory requirement for x86 processors, putting an end to decades of compatibility code that allowed the operating system to run on hardware lacking reliable TSC support. The technical change, implemented under the title "x86/cpu: Make CONFIG_X86_TSC unconditional," removes the configuration logic that previously allowed the kernel to be compiled without TSC support.

This change directly affects home users with very old machines (dating from before approximately 1993) because, starting with Linux Kernel 7.2, if you attempt to load the system on an x86 processor that lacks the TSC register, the kernel will refuse to boot, and the system will not start. This signals a significant shift in the Linux kernel's development philosophy, yet it is not the Linux equivalent of Windows 11's TPM 2.0 requirement. The TSC has been present in x86 processors since the launch of the Intel Pentium in 1993. If your processor was manufactured within the last three decades, it almost certainly includes it. The change actually aims to permanently remove compatibility code for hardware that is unlikely to run a modern Linux kernel. However, modern processors from the 1990s or later should not exhibit timing issues related to a lack of TSC support, although the kernel might refuse to boot on very old x86 CPUs that lack the TSC register.

Windows, macOS, and FreeBSD have long relied on the TSC, but their approach differs from how Linux handled it in kernel version 7.2. Windows, for instance, does not prevent the computer from booting if the processor lacks a TSC; instead, it makes that determination at runtime. If the TSC on a very old processor fails or proves unstable, Windows automatically switches to motherboard-based timers (such as HPET or the ACPI PM Timer). Of course, attempting to install Windows 11 on an older machine results in the installation failing outright, but this is due to other factors—such as TPM 2.0, Secure Boot, and processor generation (Microsoft limits official support to 8th-generation Intel processors—released in 2017—or AMD Ryzen 2000 series and newer).

What is TSC?

The TSC is a 64-bit internal physical register found within each x86 CPU core (each core has its own TSC register). It provides a basic clock-cycle counting feature, offering the precision essential for smooth operating system operation; it delivers high-resolution timing and can be read much faster than platform alternatives like HPET or the ACPI PM timer. Reading a TSC-based timer might take tens to hundreds of CPU cycles, whereas accessing a motherboard-based timer can take approximately 0.8 to 1.0 microseconds.

Having an individual TSC for each core caused issues: if a core changed its clock speed to save power, its TSC would count more slowly than that of a neighboring core (leading to time desynchronization in Linux). This is why modern CPUs feature "Constant TSC," which ensures all these internal registers run at the same speed regardless of power usage.

The TSC has three basic operational characteristics:

  • Cycle Counter: Its sole function is counting. For every clock cycle the processor executes, the register increments by 1.
  • Initialization: It starts at 0 the moment the processor receives power (hardware reset) and increments continuously.
  • Direct Reading: To read the register's value, programmers and the kernel use a specific assembly instruction called RDTSC (Read Time-Stamp Counter).

Historically, Linux maintained code to handle processors lacking a reliable TSC, dating back to the i486 era. The Linux 7.0 kernel dropped support for Intel 486 processors, and subsequent development cycles removed additional legacy hardware that had prevented the TSC from being treated as universal. Essentially, hardware predating the Pentium or from the i486 era will be affected. For decades, Linux maintained complex "fallback" routines to support timers based on older motherboards. Eliminating this dead code simplifies kernel maintenance. This is a case of technical debt—specifically, unnecessary maintenance consuming hours of highly skilled labor to support a statistically insignificant segment of users. Unlike Microsoft's controversial hardware requirements (such as TPM 2.0 for Windows 11), the TSC requirement for Linux 7.2 is simply a matter of engineering housekeeping regarding "museum pieces."

Checking TSC support and stability

To check if your computer supports TSC, run:

$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource

The output should be `tsc`.

Verify this by checking the file of available sources:

$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource

The output should look something like this: tsc hpet acpi_pm

If "tsc" is missing from this list, it means the operating system has completely lost access to it.


For the TSC to be considered modern and perfectly stable, the CPU must possess two physical properties:

  • Constant TSC: The counter advances at a constant rate, even if the CPU changes frequency (turbo mode or power-saving mode).
  • Nonstop TSC: The counter does not stop running, even if the CPU core enters a deep sleep state (C-states).


You can check if your CPU has these features using the following command:

$ lscpu | grep -E "constant_tsc|nonstop_tsc"

Options: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb pti tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi


Or by directly inspecting the processor flags:

$ cat /proc/cpuinfo | grep -E "constant_tsc|nonstop_tsc" | uniq

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb pti tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi


You can check if the kernel encountered any synchronization issues between CPU cores during boot:
$ sudo dmesg | grep -i tsc

[ 0.000000] tsc: Detected 3400.000 MHz processor
[ 0.000000] tsc: Detected 3399.906 MHz TSC
[ 0.036386] [Firmware Bug]: TSC_DEADLINE disabled due to Errata; please update microcode to version: 0x52 (or later)
[ 0.120153] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x3101f59f5e6, max_idle_ns: 440795259996 ns
[ 2.251217] clocksource: Switched to clocksource tsc-early
[ 3.281461] tsc: Refined TSC clocksource calibration: 3407.999 MHz
[ 3.281465] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x311fd336761, max_idle_ns: 440795243819 ns
[ 3.281476] clocksource: Switched to clocksource tsc
[ 4.246774] vboxdrv: TSC mode is Invariant, tentative frequency 3407999019 Hz


To check if the TSC is working perfectly and is active:

  • clocksource: Switched to clocksource tsc: Your Linux kernel has tested, validated, and enabled the TSC as the system's primary time source. It is operational.

  • Refined TSC clocksource calibration: 3407.999 MHz: The kernel has calibrated your TSC frequency with high precision to approximately 3.4 GHz.

  • vboxdrv: TSC mode is Invariant: The VirtualBox driver has confirmed that your TSC is of the "Invariant" type—equivalent to the "Constant/Nonstop" type mentioned earlier. This means its speed does not change, making it safe for running virtual machines.

The line [Firmware Bug]: TSC_DEADLINE disabled due to Errata; please update microcode to version: 0x52 (or later) indicates that your processor has an advanced feature called TSC_DEADLINE, which Linux uses for extremely fast task scheduling. However, the processor manufacturer (Intel or AMD) made a design error (known as an "erratum") during the chip's manufacturing. Since this error could cause system crashes (kernel panics) or security vulnerabilities, Linux has proactively disabled the feature to protect your PC.

To resolve this issue, you must update the processor microcode to version 0x52 or higher. Microcode acts like a corrective software update that is injected directly into the CPU during the boot process.

To view processor details:

$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 158
model name : Intel(R) Core(TM) i5-7500 CPU @ 3.40GHz
...

If your processor is Intel (Ubuntu/Debian/Mint):

$ sudo apt update && sudo apt install intel-microcode
$ sudo reboot
$ sudo dmesg | grep -i tsc
The line [Firmware Bug]: TSC_DEADLINE disabled should no longer appear.

If your processor is AMD (Ubuntu/Debian/Mint):

$ sudo apt update && sudo apt install amd64-microcode
$ sudo reboot
$ sudo dmesg | grep -i tsc
The line [Firmware Bug]: TSC_DEADLINE disabled should no longer appear.

If you use Fedora/RHEL:

$ sudo dnf install microcode_ctl
$ sudo reboot
$ sudo dmesg | grep -i tsc
The line [Firmware Bug]: TSC_DEADLINE disabled should no longer appear.

If you are using Arch Linux:

$ sudo pacman -S intel-ucode  # ou amd-ucode
$ sudo reboot
$ sudo dmesg | grep -i tsc
The line [Firmware Bug]: TSC_DEADLINE disabled should no longer appear.

Void Linux with Intel

Enable the non-free repository, if you haven't already:
$ sudo xbps-install -S void-repo-nonfree

Install the Intel microcode:
$ sudo xbps-install -S intel-ucode

Update the system's initramfs:
$ sudo xbps-reconfigure -f linux$(uname -r | cut -d'.' -f1,2)
$ sudo reboot
$ sudo dmesg | grep -i tsc
The line [Firmware Bug]: TSC_DEADLINE disabled should no longer appear.

Void Linux with AMD

Enable the non-free repository:
$ sudo xbps-install -S void-repo-nonfree

Install the AMD firmware package:
$ sudo xbps-install -S linux-firmware-amd
$ sudo reboot
Unlike Intel's, AMD's package automatically integrates with Void Linux's boot hooks, eliminating the need for extra configuration in most cases.
$ sudo dmesg | grep -i tsc
The line [Firmware Bug]: TSC_DEADLINE disabled should no longer appear.

Example:
$ sudo dmesg | grep -i tsc
[ 0.000000] tsc: Detected 3400.000 MHz processor
[ 0.000000] tsc: Detected 3399.906 MHz TSC
[ 0.036625] TSC deadline timer available
[ 0.125620] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x3101f59f5e6, max_idle_ns: 440795259996 ns
[ 2.290682] clocksource: Switched to clocksource tsc-early
[ 3.351524] tsc: Refined TSC clocksource calibration: 3408.000 MHz
[ 3.351528] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x311fd3cd494, max_idle_ns: 440795223879 ns
[ 3.351578] clocksource: Switched to clocksource tsc
[ 5.018837] vboxdrv: TSC mode is Invariant, tentative frequency 3408000024 Hz

References