Todos os produtos
Search
Central de documentação

Security Center:Detecção de arquivos maliciosos

Última atualização: Sep 17, 2026

A detecção de arquivos maliciosos é um service de segurança de arquivos do Security Center. Esse recurso identifica ameaças como ransomware, programas de mineração e web shells que podem ser introduzidas em cenários de upload de arquivos, publicação de código e compartilhamento de dados, protegendo seus sistemas e informações contra riscos de segurança. Baseado em uma plataforma de detecção multimotor, o service analisa arquivos no Object Storage Service (OSS) e em servidores, oferecendo métodos como operações no console e integração via SDK. A detecção agêntica de arquivos maliciosos, ativada sob o modelo de pagamento conforme o uso, adiciona suporte a detecção por modelos de linguagem de IA, detecção de arquivos Skill e detecção de arquivos NAS. Este tópico ajuda usuários de diferentes funções a escolher rapidamente o método de detecção mais adequado para seus cenários de negócio.

Antes de começar

Ative o malicious file detection. As capacidades de detecção disponíveis variam conforme o método de faturamento escolhido na ativação do service.

  • Ao ativar a detecção de arquivos maliciosos no modelo de assinatura, você tem acesso a recursos básicos como detecção multimotor, análise de arquivos compactados e verificação de arquivos criptografados. A detecção por modelos de linguagem de IA, a detecção de arquivos Skill e a detecção de arquivos NAS não são suportadas.

  • Caso opte pela detecção agêntica de arquivos maliciosos no modelo de pagamento conforme o uso, além das funcionalidades padrão, você também poderá utilizar a detecção por modelos de linguagem de IA, a detecção de arquivos Skill e a detecção de arquivos NAS.

Escopo

  • Tipos de arquivo suportados

    • Detecção de arquivos compactados: Permite descompactar e verificar pacotes não criptografados. É possível configure o nível de descompactação e a quantidade máxima de arquivos. Essa configuração aplica-se apenas a arquivos do OSS.

    • Detecção de arquivos criptografados: Oferece descriptografia automática e verificação de dados protegidos com criptografia no lado do servidor do OSS (SSE-KMS, SSE-OSS). Aplica-se exclusivamente a arquivos do OSS.

    • Detecção de arquivos NAS (apenas pagamento conforme o uso): Analisa arquivos armazenados no Apsara File Storage NAS. Os tipos de sistema de arquivos, zonas e limites suportados dependem do que é exibido no console.

    • Detecção de arquivos Skill (apenas pagamento conforme o uso): Fornece capacidades especializadas para analisar arquivos Skill, abrangendo mais formatos e cenários de ataque.

  • Formatos de arquivo suportados: Diversos tipos são aceitos, incluindo pacotes compactados, scripts/web shells, imagens e executáveis/binários. Apenas os formatos mais comuns estão listados aqui. Para a lista completa, consulte o console.

    • Pacotes compactados: .7z,.zip,.rar,.tar,.gz,.bz2,.xz,.lzma,.ar,.tar.gz, entre outros.

    • Scripts/WebShell: .php,.jsp,.jspx,.asp,.aspx,.sh,.py,.ps1,.pl,.bat,.html, entre outros.

    • Documentos: .doc,.pdf,.ppt,.xsl,.rtf,.hta,.chm,.docx, entre outros.

    • Imagens: .jpg,.jpeg,.png, entre outros.

    • Executáveis e binários: .apk,.exe,.dll,.ocx,.com,.so,.sys,.ko,.obj, entre outros.

  • Tipos de vírus suportados: Identifica backdoors de reverse shell, trojans DDoS, programas de mineração e outros arquivos virais. Para mais detalhes, consulte Supported virus types.

  • Restrições de classe de armazenamento: Apenas arquivos armazenados no OSS com classe de armazenamento Standard ou Infrequent Access podem ser analisados. A classe Archive não é suportada.

  • Regiões suportadas:

    • China (Qingdao), China (Beijing), China (Zhangjiakou), China (Hohhot), China (Ulanqab)

    • China (Hangzhou), China (Shanghai)

    • China (Shenzhen), China (Heyuan), China (Guangzhou)

    • China (Chengdu), China (Hong Kong)

    • Singapore, Malaysia (Kuala Lumpur), Indonesia (Jakarta), Philippines (Manila), Thailand (Bangkok), Japan (Tokyo), South Korea (Seoul), US (Silicon Valley), US (Virginia), Germany (Frankfurt), UK (London)

Configure e execute tarefas de detecção

O Security Center oferece duas formas de execute tarefas de detecção: operações no console e integração via SDK.

Recurso

Operação no console

Integração via SDK

Como usar

Faça login no console do Security Center e execute as operações por meio de uma interface gráfica.

Integre e invoque o SDK diretamente no seu código de aplicação. Há suporte para Java e Python.

Arquivos suportados

Suporta arquivos do Object Storage Service (OSS) e do Apsara File Storage NAS. Abas distintas exibem as listas de recursos correspondentes, mas as operações permanecem as mesmas.

Nota

A detecção de arquivos NAS está disponível apenas no modelo de pagamento conforme o uso (detecção agêntica de arquivos maliciosos).

  • Arquivos de servidor: Podem ser acessados e processados diretamente, como uploads de usuários em tempo real ou arquivos locais específicos no servidor.

  • Arquivos OSS: Gere uma URL de download válida para os arquivos armazenados no OSS, permitindo que o sistema os extraia e analise.

  • Arquivos NAS (apenas pagamento conforme o uso): Gere um caminho de acesso válido ou URL de download para arquivos no NAS, possibilitando a extração e detecção pelo sistema.

Operações no console

Se os arquivos a serem analisados estiverem em buckets do Alibaba Cloud Object Storage Service (OSS) ou em sistemas de arquivos NAS, utilize o console do Security Center para verificá-los em lote ou periodicamente.

  • Detecção manual: Ideal para varreduras únicas de arquivos existentes. Suporta detecção completa e detecção incremental.

  • Detecção automática: Recomendada para varredura contínua e automatizada de novos arquivos.

Detecção manual (arquivos existentes)

  1. Acesse a página de detecção de arquivos

    Acesse o console do Security Center - Risk Governance - Malicious File Detection. No canto superior esquerdo da página, selecione a região dos seus ativos: Chinese Mainland ou Outside Chinese Mainland.

  2. Inicie uma tarefa de detecção

    OSS File Check

    1. Clique em na aba OSS File Check.

    2. Sincronize os arquivos (opcional): Caso o bucket não apareça na lista de OSS File Check, clique em Synchronize Buckets para atualizar a lista de buckets.

    3. Crie uma tarefa de detecção:

      • Detecção completa:

        • Descrição: Analisa todos os arquivos em um ou mais buckets.

        • Entrada da operação:

          • Detecção individual: Na coluna Actions do bucket desejado, clique em Check.

          • Detecção em lote: Selecione vários buckets e clique em Batch Check abaixo da lista.

      • Detecção incremental

        • Descrição: Em buckets já verificados que receberam atualizações, analisa apenas os arquivos adicionados ou modificados desde a última tarefa.

        • Entrada da operação: Na coluna Actions do bucket alvo, clique em Incremental Check.

    4. Configure os parâmetros de detecção: Na caixa de diálogo exibida, defina os seguintes parâmetros.

      • File Check Type: Escolha as extensões de arquivo a serem verificadas. Por padrão, todos os tipos são analisados.

      • Decompression Level e Max Files per Archive: Para verificar o conteúdo de pacotes compactados, defina o nível de descompactação (até 5 níveis) e a quantidade máxima de arquivos por pacote (até 1.000). A descompactação vem desativada por padrão.

      • File Decryption Type: Se os arquivos do OSS utilizarem criptografia no lado do servidor (SSE-OSS ou SSE-KMS), selecione o método de descriptografia correspondente para que o Security Center possa analisá-los.

      • Escopo de arquivos para detecção: Defina o intervalo de data e hora da análise. Somente arquivos dentro desse período serão verificados.

      • Scan Path:

        • Match by Prefix: Insira um prefixo de nome de arquivo para verificar arquivos específicos.

        • Configure for Entire Bucket: Verifica todos os arquivos presentes no bucket.

    NAS File Detection (apenas pagamento conforme o uso)

    1. Clique em na aba NAS File Detection.

    2. Sincronize os arquivos (opcional): Se o sistema de arquivos não constar na lista de NAS File Detection, clique em Synchronize File System para obter a lista mais recente.

    3. Crie uma tarefa de detecção:

      • Detecção completa:

        • Descrição: Verifica todos os arquivos em um ou mais sistemas de arquivos.

        • Entrada da operação:

          • Detecção individual: Na coluna Actions do sistema de arquivos desejado, clique em Check.

          • Detecção em lote: Selecione múltiplos sistemas de arquivos e clique em Batch Check abaixo da lista.

      • Detecção incremental

        • Descrição: Para sistemas de arquivos já verificados e com atualizações recentes, analisa somente os arquivos adicionados ou alterados desde a última execução.

        • Entrada da operação: Na coluna Actions do sistema de arquivos alvo, clique em Incremental Check.

    4. Configure os parâmetros de detecção: Na caixa de diálogo aberta, ajuste os parâmetros abaixo.

      • File Check Type: Selecione as extensões de arquivo a serem escaneadas. O padrão inclui todos os tipos.

      • Detection File Scope: Defina o intervalo de data e hora para a análise. Apenas arquivos nesse período serão processados.

  3. Aguarde a conclusão da tarefa de detecção: Acompanhe o File Check Status na lista de buckets ou sistemas de arquivos. Quando o status mudar de Not Checked para Checked, a detecção estará finalizada.

    Nota

    Após o término da tarefa, estatísticas e sincronização de dados ocorrem em segundo plano. Os resultados geralmente apresentam um atraso de 1 a 2 horas. Aguarde esse período.

Detecção automática (arquivos incrementais)

  1. Acesse a página de gerenciamento de políticas

    1. Acesse o console do Security Center - Risk Governance - Malicious File Detection. No canto superior esquerdo, escolha a região dos seus ativos: Chinese Mainland ou Outside Chinese Mainland.

    2. Clique em Policy Management no canto superior direito.

  2. Crie ou modifique uma política de detecção

    • Criar nova política: No painel Policy Management, clique em Create Policy.

    • Modificar política existente: Na coluna Actions da política desejada, clique em Edit para adicionar o bucket ou sistema de arquivos ao escopo de atuação da política.

  3. Configure as informações básicas: Na página Policy Configuration, preencha os dados fundamentais da política.

    • Effective Products: Selecione OSS.

    • Policy Name: Insira um nome para a política.

    • Policy Status: Ative ou desative a política.

    • Produto efetivo: Escolha OSS/NAS.

  4. Configure os detalhes da política: Os itens de configuração variam conforme o product selecionado. Ajuste os parâmetros de acordo com sua escolha.

    Política OSS

    • Increment Real-time Detection:

      Nota

      A detecção incremental em tempo real pode ser configurada apenas nas regiões de Chinese Mainland. Não há suporte para regiões Outside Chinese Mainland.

      • Ativar: Ao fazer upload de um novo arquivo no bucket especificado, a detecção é acionada imediatamente.

      • Desativar: Verifica novos arquivos com base no ciclo de detecção configurado (como diariamente ou a cada 3 dias) e no horário de detecção (por exemplo, 02:00-04:00).

    • Scan Path: Escolha entre correspondência por prefixo ou aplicação em todo o bucket.

    • Escopo de arquivos para detecção: Defina o intervalo de data e hora da análise. Somente arquivos dentro desse período serão verificados.

    • File Check Type: Selecione as extensões a serem verificadas. Por padrão, todos os tipos são incluídos.

    • Decompression Level e Max Files per Archive: Para analisar o conteúdo de pacotes compactados, configure o nível de descompactação (até 5 níveis) e o limite de arquivos por pacote (até 1.000). A descompactação é desativada por padrão.

    • File Decryption Type: Caso os arquivos do OSS usem criptografia no lado do servidor (SSE-OSS ou SSE-KMS), selecione o método de descriptografia adequado para permitir a análise pelo Security Center.

    • Effective Bucket: Escolha um ou mais buckets aos quais esta política se aplica. Se o bucket já estiver vinculado a outra política, não será possível selecioná-lo novamente.

      Aviso

      Depois que a política entrar em vigor, arquivos em buckets recém-adicionados não serão detectados automaticamente. Para incluí-los, edite manualmente a política e adicione-os à lista Effective Bucket.

    Política NAS (apenas pagamento conforme o uso)

    • Detection Cycle: Defina o ciclo de execução da tarefa de detecção.

    • Check Time: Escolha o horário de execução da tarefa. O intervalo não pode ser inferior a 1 hora.

      Aviso

      Se a tarefa ultrapassar o tempo de detecção configurado, ela será pausada automaticamente e retomada no próximo ciclo.

    • Detection File Scope: Selecione o intervalo de data e hora para a análise. Apenas arquivos nesse período serão escaneados.

    • File Check Type: Escolha as extensões de arquivo a serem verificadas. Todos os tipos são detectados por padrão.

    • Effective File System: Selecione um ou mais sistemas de arquivos NAS para aplicar esta política. Sistemas já vinculados a outras políticas não podem ser selecionados novamente.

  5. Após concluir a configuração, clique em OK.

Integração via SDK

Integre o service de detecção de arquivos maliciosos ao seu código de aplicação para obter informações sobre ameaças nos resultados retornados e implementar a verificação de arquivos. A detecção agêntica de arquivos maliciosos, ativada sob pagamento conforme o uso, oferece adicionalmente detecção por modelos de linguagem de IA, detecção de arquivos Skill e outras capacidades.

Etapa 1: Preparar credenciais de acesso e permissões

  1. Crie uma chave de acesso

    Para garantir a segurança da conta, evite usar o AccessKey da sua conta Alibaba Cloud principal. Recomendamos crie um usuário RAM dedicado para acesso à API, concedendo apenas as permissões mínimas necessárias. Para mais informações, consulte Create a RAM user e Create an AccessKey.

    Criar uma nova conta

    1. Faça login no console RAM usando sua conta Alibaba Cloud ou uma conta de administrador RAM. Na página Users, clique em Create User.

    2. Preencha a configuração conforme as informações abaixo:

      1. User Account Information: Insira o nome de login, tags e demais dados.

      2. Direct Access: Marque Use Permanent AccessKey to Access.

    3. Conclua a verificação de segurança. O sistema gera automaticamente um AccessKey ID e um AccessKey Secret para o usuário RAM. Mantenha essas informações em local seguro.

      Nota

      Baixe o arquivo CSV da chave ou copie o conteúdo e salve-o localmente. Para mais detalhes, consulte Create an AccessKey pair.

    Conta RAM existente

    1. Faça login no console RAM com sua conta Alibaba Cloud ou administrador RAM e acesse a página de detalhes do usuário alvo.

    2. Na aba Logon-free Configuration, dentro da seção AccessKey Pair, clique em Create AccessKey.

    3. Escolha um cenário de uso conforme sua necessidade, marque I confirm that I must create an AccessKey pair e clique em Continue to Create.

    4. Complete a verificação de segurança. O sistema gerará automaticamente um AccessKey ID e um AccessKey Secret para o usuário RAM. Guarde essas informações com segurança.

      Nota

      É possível baixe o arquivo CSV da chave ou copiar o conteúdo para salvá-lo localmente. Consulte Create an AccessKey para mais informações.

  2. Configure políticas de permissão

    1. Na página Users, clique em no usuário RAM desejado. Na coluna Actions, clique em Grant permissions to the user..

    2. Na seção Policy, selecione AliyunYundunSASFullAccess e clique em Confirm Authorization.

      Nota

      Para mais detalhes, consulte Grant permissions to a RAM user.

  3. Configure variáveis de ambiente

    Os SDKs da Alibaba Cloud permitem crie credenciais de acesso padrão definindo as variáveis de ambiente ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET. Ao invocar uma API, o programa acessa diretamente essas credenciais, lê a chave de acesso (AccessKey) e conclui a autenticação automaticamente. Para mais informações, consulte Configure environment variables.

    Linux/macOS

    • Configure o AccessKey ID e pressione Enter.

      # Replace yourAccessKeyID with your AccessKey ID.
      export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID
    • Configure o AccessKey secret e pressione Enter.

      # Replace yourAccessKeySecret with your AccessKey secret.
      export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret
    • Verifique a configuração.

      Execute o comando echo $ALIBABA_CLOUD_ACCESS_KEY_ID. Se o retorno for o AccessKey ID correto, a configuração foi bem-sucedida.

    Windows

    Usar a interface gráfica do usuário (GUI)

    • Procedimento

      Os passos a seguir descrevem como defina variáveis de ambiente via GUI no Windows 10.

      Na área de trabalho, clique em com o botão direito em This PC e escolha Properties > Advanced system settings > Environment Variables > New em System variables ou User variables. Em seguida, preencha a configuração.

      Variável

      Valor de exemplo

      AccessKey ID

      • Nome da variável: ALIBABA_CLOUD_ACCESS_KEY_ID

      • Valor da variável: yourAccessKeyID

      AccessKey secret

      • Nome da variável: ALIBABA_CLOUD_ACCESS_KEY_SECRET

      • Valor da variável: yourAccessKeySecret

    • Teste a configuração

      Clique em Start (ou use o atalho Win+R), clique em Run, digite cmd e clique em OK (ou pressione Enter) para abrir o prompt de comando. Execute os comandos echo %ALIBABA_CLOUD_ACCESS_KEY_ID% e echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Se os comandos retornarem o AccessKey correto, a configuração foi bem-sucedida.

    Usar o prompt de comando (CMD)

    • Procedimento

      Abra o prompt de comando como administrador e execute os comandos abaixo para adicionar novas variáveis de ambiente ao sistema.

      setx ALIBABA_CLOUD_ACCESS_KEY_ID yourAccessKeyID /M
      setx ALIBABA_CLOUD_ACCESS_KEY_SECRET yourAccessKeySecret /M

      O parâmetro /M indica uma variável de ambiente do sistema. Você pode omitir esse parâmetro ao defina uma variável de ambiente de usuário.

    • Teste a configuração

      Clique em Start (ou use o atalho Win+R), clique em Run, digite cmd e clique em OK (ou pressione Enter) para abrir o prompt de comando. Execute os comandos echo %ALIBABA_CLOUD_ACCESS_KEY_ID% e echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Se o retorno for o AccessKey correto, a configuração está correta.

    Usar o Windows PowerShell

    No PowerShell, defina novas variáveis de ambiente válidas para todas as novas sessões:

    [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::User)
    [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::User)

    Para defina variáveis de ambiente para todos os usuários, são necessárias permissões administrativas:

    [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::Machine)
    [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::Machine)

    Defina variáveis de ambiente temporárias, válidas apenas para a sessão atual:

    $env:ALIBABA_CLOUD_ACCESS_KEY_ID = "yourAccessKeyID"
    $env:ALIBABA_CLOUD_ACCESS_KEY_SECRET = "yourAccessKeySecret"

    No PowerShell, execute os comandos Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_ID e Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_SECRET. Se o retorno for o AccessKey correto, a configuração foi bem-sucedida.

Etapa 2: Instale o SDK

Escolha o método de instalação conforme sua linguagem de desenvolvimento. Atualmente, apenas Java e Python são suportados.

Java

  • Pré-requisito: JDK 1.8 ou superior.

  • Instalação:

    1. Acesse o repositório do SDK Java para baixe a versão mais recente do arquivo do SDK Java.

    2. Adicione o arquivo do SDK baixado ao seu projeto.

Python

  • Pré-requisito: Python 3.6 ou superior.

  • Instalação:

    • Instalação online: Instale rapidamente usando pip.

      <BASH>
      
      pip install -U alibabacloud_filedetect
    • Instalação offline:

      1. Em um ambiente com rede, acesse o repositório do SDK Python para baixe a versão mais recente do SDK Python.

      2. Faça upload do pacote de código-fonte baixado para o ambiente do seu projeto e descompacte-o.

      3. Navegue até o diretório raiz do SDK descompactado e execute o comando de instalação:

        <BASH>
        
        # Change to the Python SDK root directory
        # The directory name may vary by version, e.g., alibabacloud_filedetect-1.0.0
        cd alibabacloud_filedetect-x.x.x/
        
        # Install using your Python version
        python setup.py install

Etapa 3: Escrever o código e execute a detecção

Com o ambiente configurado, utilize os exemplos de código Python e Java abaixo como referência para escrever seu próprio código.

Importante

Substitua os parâmetros path, URL e MD5 nos códigos de exemplo pelos seus valores reais.

package com.aliyun.filedetect.sample;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import com.aliyun.filedetect.*;

public class Sample {

	/**
	 * Synchronous file detection interface
	 * @param detector Detector object
	 * @param path Path of the file to be detected
	 * @param timeout_ms Set the timeout period in milliseconds
	 * @param wait_if_queuefull If the detection queue is full, false indicates returning an error immediately without waiting, while true indicates waiting until the queue has space.
	 * @throws InterruptedException
	 */
	public static DetectResult detectFileSync(OpenAPIDetector detector, String path, int timeout_ms, boolean wait_if_queuefull) throws InterruptedException {
		if (null == detector || null == path) return null;
		DetectResult result = null;
		while(true) {
			result = detector.detectSync(path, timeout_ms);
			if (null == result) break;
			if (result.error_code != ERR_CODE.ERR_DETECT_QUEUE_FULL) break;
			if (!wait_if_queuefull) break;
			detector.waitQueueAvailable(-1);
		}
		return result;
	}

	/**
	 * Asynchronous file detection interface
	 * @param detector Detector object
	 * @param path Path of the file to be detected
	 * @param timeout_ms Set the timeout period in milliseconds
	 * @param wait_if_queuefull If the detection queue is full, false indicates returning an error immediately without waiting, while true indicates waiting until the queue has space.
	 * @param callback Callback function for the result
	 * @throws InterruptedException
	 */
	public static int detectFile(OpenAPIDetector detector, String path, int timeout_ms, boolean wait_if_queuefull, IDetectResultCallback callback) throws InterruptedException {
		if (null == detector || null == path || null == callback) return ERR_CODE.ERR_INIT.value();
		int result = ERR_CODE.ERR_INIT.value();
		if (wait_if_queuefull) {
			final IDetectResultCallback real_callback = callback;
			callback = new IDetectResultCallback() {
				public void onScanResult(int seq, String file_path, DetectResult callback_res) {
					if (callback_res.error_code == ERR_CODE.ERR_DETECT_QUEUE_FULL) return;
					real_callback.onScanResult(seq, file_path, callback_res);
				}
			};
		}
		while(true) {
			result = detector.detect(path, timeout_ms, callback);
			if (result != ERR_CODE.ERR_DETECT_QUEUE_FULL.value()) break;
			if (!wait_if_queuefull) break;
			detector.waitQueueAvailable(-1);
		}
		return result;
	}

	/**
	 * Synchronous URL file detection interface
	 * @param detector Detector object
	 * @param url URL of the file to be detected
	 * @param md5 MD5 hash of the file to be detected
	 * @param timeout_ms Set the timeout period in milliseconds
	 * @param wait_if_queuefull If the detection queue is full, false indicates returning an error immediately without waiting, while true indicates waiting until the queue has space.
	 * @throws InterruptedException
	 */
	public static DetectResult detectUrlSync(OpenAPIDetector detector, String url, String md5, int timeout_ms, boolean wait_if_queuefull) throws InterruptedException {
		if (null == detector || null == url || null == md5) return null;
		DetectResult result = null;
		while(true) {
			result = detector.detectUrlSync(url, md5, timeout_ms);
			if (null == result) break;
			if (result.error_code != ERR_CODE.ERR_DETECT_QUEUE_FULL) break;
			if (!wait_if_queuefull) break;
			detector.waitQueueAvailable(-1);
		}
		return result;
	}

	/**
	 * Asynchronous URL file detection interface
	 * @param detector Detector object
	 * @param url URL of the file to be detected
	 * @param md5 MD5 hash of the file to be detected
	 * @param timeout_ms Set the timeout period in milliseconds
	 * @param wait_if_queuefull If the detection queue is full, false indicates returning an error immediately without waiting, while true indicates waiting until the queue has space.
	 * @param callback Callback function for the result
	 * @throws InterruptedException
	 */
	public static int detectUrl(OpenAPIDetector detector, String url, String md5, int timeout_ms, boolean wait_if_queuefull, IDetectResultCallback callback) throws InterruptedException {
		if (null == detector || null == url || null == md5 || null == callback) return ERR_CODE.ERR_INIT.value();
		int result = ERR_CODE.ERR_INIT.value();
		if (wait_if_queuefull) {
			final IDetectResultCallback real_callback = callback;
			callback = new IDetectResultCallback() {
				public void onScanResult(int seq, String file_path, DetectResult callback_res) {
					if (callback_res.error_code == ERR_CODE.ERR_DETECT_QUEUE_FULL) return;
					real_callback.onScanResult(seq, file_path, callback_res);
				}
			};
		}
		while(true) {
			result = detector.detectUrl(url, md5, timeout_ms, callback);
			if (result != ERR_CODE.ERR_DETECT_QUEUE_FULL.value()) break;
			if (!wait_if_queuefull) break;
			detector.waitQueueAvailable(-1);
		}
		return result;
	}

	/**
	 * Format the detection result
	 * @param result Detection result object
	 * @return Formatted string
	 */
	public static String formatDetectResult(DetectResult result) {
		if (result.isSucc()) {
			DetectResult.DetectResultInfo info = result.getDetectResultInfo();
			String msg = String.format("[DETECT RESULT] [SUCCEED] %s", formatDetectResultInfo(info));
			if (info.compresslist != null) {
				int idx = 1;
				for (DetectResult.CompressFileDetectResultInfo comp_res : info.compresslist) {
					msg += String.format("\n\t\t\t [COMPRESS FILE] [IDX:%d] %s", idx++, formatCompressFileDetectResultInfo(comp_res));
				}
			}
			return msg;
		}
		DetectResult.ErrorInfo info = result.getErrorInfo();
		return String.format("[DETECT RESULT] [FAIL] md5: %s, time: %d, error_code: %s, error_message: %s"
				, info.md5, info.time, info.error_code.name(), info.error_string);
	}

	private static String formatDetectResultInfo(DetectResult.DetectResultInfo info) {
		String msg = String.format("MD5: %s, TIME: %d, RESULT: %s, SCORE: %d", info.md5, info.time, info.result.name(), info.score);
		if (info.compresslist != null) {
			msg += String.format(", COMPRESS_FILES: %d", info.compresslist.size());
		}
		DetectResult.VirusInfo vinfo = info.getVirusInfo();
		if (vinfo != null) {
			msg += String.format(", VIRUS_TYPE: %s, EXT_INFO: %s", vinfo.virus_type, vinfo.ext_info);
		}
		return msg;
	}
	private static String formatCompressFileDetectResultInfo(DetectResult.CompressFileDetectResultInfo info) {
		String msg = String.format("PATH: %s, \t\t RESULT: %s, SCORE: %d", info.path, info.result.name(), info.score);
		DetectResult.VirusInfo vinfo = info.getVirusInfo();
		if (vinfo != null) {
			msg += String.format(", VIRUS_TYPE: %s, EXT_INFO: %s", vinfo.virus_type, vinfo.ext_info);
		}
		return msg;
	}

	/**
	 * Synchronously detect a directory or file
	 * @param path The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
	 * @param is_sync Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. true: synchronous, false: asynchronous
	 * @throws InterruptedException
	 */
	public static void detectDirOrFileSync(OpenAPIDetector detector, String path, int timeout_ms, Map<String, DetectResult> result_map) throws InterruptedException {
		File file = new File(path);
		String abs_path = file.getAbsolutePath();
		if (file.isDirectory()) {
			String[] ss = file.list();
	        if (ss == null) return;
	        for (String s : ss) {
	        	String subpath = abs_path + File.separator + s;
	        	detectDirOrFileSync(detector, subpath, timeout_ms, result_map);
	        }
			return;
		}

    	System.out.println(String.format("[detectFileSync] [BEGIN] queueSize: %d, path: %s, timeout: %d", detector.getQueueSize(), abs_path, timeout_ms));
		DetectResult res = detectFileSync(detector, abs_path, timeout_ms, true);
    	System.err.println(String.format("                 [ END ] %s", formatDetectResult(res)));
		result_map.put(abs_path, res);
	}

	/**
	 * Asynchronously detect a directory or file
	 * @param path The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
	 * @param is_sync Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. true: synchronous, false: asynchronous
	 * @throws InterruptedException
	 */
	public static void detectDirOrFile(OpenAPIDetector detector, String path, int timeout_ms, IDetectResultCallback callback) throws InterruptedException {
		File file = new File(path);
		String abs_path = file.getAbsolutePath();
		if (file.isDirectory()) {
			String[] ss = file.list();
	        if (ss == null) return;
	        for (String s : ss) {
	        	String subpath = abs_path + File.separator + s;
	        	detectDirOrFile(detector, subpath, timeout_ms, callback);
	        }
	        return;
		}

		int seq = detectFile(detector, abs_path, timeout_ms, true, callback);
		System.out.println(String.format("[detectFile] [BEGIN] seq: %d, queueSize: %d, path: %s, timeout: %d", seq, detector.getQueueSize(), abs_path, timeout_ms));
	}

	/**
	 * Start detecting a file or directory
	 * @param path The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
	 * @param is_sync Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. true: synchronous, false: asynchronous
	 * @throws InterruptedException
	 */
	public static void scan(final OpenAPIDetector detector, String path, int detect_timeout_ms, boolean is_sync) throws InterruptedException {
		System.out.println(String.format("[SCAN] [START] path: %s, detect_timeout_ms: %d, is_sync: %b", path, detect_timeout_ms, is_sync));
		long start_time = System.currentTimeMillis();
		final Map<String, DetectResult> result_map = new HashMap<>();
		if (is_sync) {
			detectDirOrFileSync(detector, path, detect_timeout_ms, result_map);
		} else {
			detectDirOrFile(detector, path, detect_timeout_ms, new IDetectResultCallback() {
				public void onScanResult(int seq, String file_path, DetectResult callback_res) {
			    	System.err.println(String.format("[detectFile] [ END ] seq: %d, queueSize: %d, %s", seq, detector.getQueueSize(), formatDetectResult(callback_res)));
					result_map.put(file_path, callback_res);
				}
			});
			// Wait for the task to complete.
			detector.waitQueueEmpty(-1);
		}
		long used_time = System.currentTimeMillis() - start_time;
		System.out.println(String.format("[SCAN] [ END ] used_time: %d, files: %d", used_time, result_map.size()));

		int fail_count = 0;
		int white_count = 0;
		int black_count = 0;
		for (Map.Entry<String, DetectResult> entry : result_map.entrySet()) {
			DetectResult res = entry.getValue();
			if (res.isSucc()) {
				if (res.getDetectResultInfo().result == DetectResult.RESULT.RES_BLACK) {
					black_count ++;
				} else {
					white_count ++;
				}
			} else {
				fail_count ++;
			}
		}
		System.out.println(String.format("             fail_count: %d, white_count: %d, black_count: %d"
				, fail_count, white_count, black_count));
	}

    public static void main(String[] args_) throws Exception {
    	// Get the detector instance.
    	OpenAPIDetector detector = OpenAPIDetector.getInstance();

    	// Initialize.
    	ERR_CODE init_ret = detector.init(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    	System.out.println("INIT RET: " + init_ret.name());

    	// Set decompression parameters (optional, compressed packages are not decompressed by default).
    	boolean decompress = true; // Specifies whether to identify and decompress compressed files. Default is false.
    	int decompressMaxLayer = 5; // Maximum decompression level. Effective when decompress is true.
    	int decompressMaxFileCount = 1000; // Maximum number of decompressed files. Effective when decompress is true.
    	ERR_CODE initdec_ret = detector.initDecompress(decompress, decompressMaxLayer, decompressMaxFileCount);
    	System.out.println("INIT_DECOMPRESS RET: " + initdec_ret.name());

    	if (true) {
    		// Example 1: Scan a local directory or file.
    		boolean is_sync_scan = false; // Specifies whether to use asynchronous or synchronous detection. Asynchronous detection offers better performance. false indicates asynchronous detection.
        	int timeout_ms = 500000;  // Detection time for a single sample, in milliseconds.
        	String path = "test2.php"; // The file or directory to be scanned.
        	// Start the scan and wait for it to finish.
        	scan(detector, path, timeout_ms, is_sync_scan);
    	}

    	if (true) {
    		// Example 2: Scan a URL file.
        	int timeout_ms = 500000;  // Detection time for a single sample, in milliseconds.
        	String url = "https://xxxxxxxx.oss-cn-hangzhou-1.aliyuncs.com/xxxxx/xxxxxxxxxxxxxx?Expires=1*****25&OSSAccessKeyId=xxx"; // The URL file to be scanned.
        	String md5 = "a767f*************6e21d000000"; // The MD5 hash of the file to be scanned.
        	// Synchronous scan. To perform an asynchronous scan, call the detectUrl interface.
        	System.out.println(String.format("[detectUrlSync] [BEGIN] URL: %s, MD5: %s, TIMEOUT: %d", url, md5, timeout_ms));
        	DetectResult result = detectUrlSync(detector, url, md5, timeout_ms, true);
        	System.err.println(String.format("[detectUrlSync] [ END ] %s", formatDetectResult(result)));
    	}

		// Deinitialize.
		System.out.println("Over.");
    	detector.uninit();
    }
}
# -*- coding: utf-8 -*-
import os
import sys
from typing import List
import threading
import time
import traceback

from alibabacloud_filedetect.OpenAPIDetector import OpenAPIDetector
from alibabacloud_filedetect.IDetectResultCallback import IDetectResultCallback
from alibabacloud_filedetect.ERR_CODE import ERR_CODE
from alibabacloud_filedetect.DetectResult import DetectResult

class Sample(object):

    def __init__(self):
        pass

    """
    Synchronous file detection interface
    @param detector: Detector object
    @param path: Path of the file to be detected
    @param timeout_ms: Set the timeout period in milliseconds
    @param wait_if_queuefull: If the detection queue is full, False indicates returning an error immediately without waiting, while True indicates waiting until the queue has space.
    """
    def detectFileSync(self, detector, path, timeout_ms, wait_if_queuefull):
        if detector is None or path is None:
            return None
        result = None
        while True:
            result = detector.detectSync(path, timeout_ms)
            if result is None:
                break
            if result.error_code != ERR_CODE.ERR_DETECT_QUEUE_FULL:
                break
            if wait_if_queuefull is False:
                break
            detector.waitQueueAvailable(-1)
        return result

    """
    Asynchronous file detection interface
    @param detector: Detector object
    @param path: Path of the file to be detected
    @param timeout_ms: Set the timeout period in milliseconds
    @param wait_if_queuefull: If the detection queue is full, False indicates returning an error immediately without waiting, while True indicates waiting until the queue has space.
    @param callback: Callback function for the result
    """
    def detectFile(self, detector, path, timeout_ms, wait_if_queuefull, callback):
        if detector is None or path is None or callback is None:
            return ERR_CODE.ERR_INIT.value
        result = ERR_CODE.ERR_INIT.value
        if wait_if_queuefull:
            real_callback = callback
            class AsyncTaskCallback(IDetectResultCallback):
                def onScanResult(self, seq, file_path, callback_res):
                    if callback_res.error_code == ERR_CODE.ERR_DETECT_QUEUE_FULL:
                        return
                    real_callback.onScanResult(seq, file_path, callback_res)
            callback = AsyncTaskCallback()
        while True:
            result = detector.detect(path, timeout_ms, callback)
            if result != ERR_CODE.ERR_DETECT_QUEUE_FULL.value:
                break
            if wait_if_queuefull is False:
                break
            detector.waitQueueAvailable(-1)
        return result

    """
    Synchronous URL file detection interface
    @param detector: Detector object
    @param url: URL of the file to be detected
    @param md5: MD5 hash of the file to be detected
    @param timeout_ms: Set the timeout period in milliseconds
    @param wait_if_queuefull: If the detection queue is full, False indicates returning an error immediately without waiting, while True indicates waiting until the queue has space.
    """
    def detectUrlSync(self, detector, url, md5, timeout_ms, wait_if_queuefull):
        if detector is None or url is None or md5 is None:
            return None
        result = None
        while True:
            result = detector.detectUrlSync(url, md5, timeout_ms)
            if result is None:
                break
            if result.error_code != ERR_CODE.ERR_DETECT_QUEUE_FULL:
                break
            if wait_if_queuefull is False:
                break
            detector.waitQueueAvailable(-1)
        return result

    """
    Asynchronous URL file detection interface
    @param detector: Detector object
    @param url: URL of the file to be detected
    @param md5: MD5 hash of the file to be detected
    @param timeout_ms: Set the timeout period in milliseconds
    @param wait_if_queuefull: If the detection queue is full, False indicates returning an error immediately without waiting, while True indicates waiting until the queue has space.
    @param callback: Callback function for the result
    """
    def detectUrl(self, detector, url, md5, timeout_ms, wait_if_queuefull, callback):
        if detector is None or url is None or md5 is None or callback is None:
            return ERR_CODE.ERR_INIT.value
        result = ERR_CODE.ERR_INIT.value
        if wait_if_queuefull:
            real_callback = callback
            class AsyncTaskCallback(IDetectResultCallback):
                def onScanResult(self, seq, file_path, callback_res):
                    if callback_res.error_code == ERR_CODE.ERR_DETECT_QUEUE_FULL:
                        return
                    real_callback.onScanResult(seq, file_path, callback_res)
            callback = AsyncTaskCallback()
        while True:
            result = detector.detectUrl(url, md5, timeout_ms, callback)
            if result != ERR_CODE.ERR_DETECT_QUEUE_FULL.value:
                break
            if wait_if_queuefull is False:
                break
            detector.waitQueueAvailable(-1)
        return result

    """
    Format the detection result
    @param result: Detection result object
    @return: Formatted string
    """
    @staticmethod
    def formatDetectResult(result):
        msg = ""
        if result.isSucc():
            info = result.getDetectResultInfo()
            msg = "[DETECT RESULT] [SUCCEED] {}".format(Sample.formatDetectResultInfo(info))
            if info.compresslist is not None:
                idx = 1
                for comp_res in info.compresslist:
                    msg += "\n\t\t\t [COMPRESS FILE] [IDX:{}] {}".format(idx, Sample.formatCompressFileDetectResultInfo(comp_res))
                    idx += 1
        else:
            info = result.getErrorInfo()
            msg = "[DETECT RESULT] [FAIL] md5: {}, time: {}, error_code: {}, error_message: {}".format(info.md5,
                info.time, info.error_code.name, info.error_string)
        return msg

    @staticmethod
    def formatDetectResultInfo(info):
        msg = "MD5: {}, TIME: {}, RESULT: {}, SCORE: {}".format(info.md5, info.time, info.result.name, info.score)
        if info.compresslist is not None:
            msg += ", COMPRESS_FILES: {}".format(len(info.compresslist))
        vinfo = info.getVirusInfo()
        if vinfo is not None:
            msg += ", VIRUS_TYPE: {}, EXT_INFO: {}".format(vinfo.virus_type, vinfo.ext_info)
        return msg

    @staticmethod
    def formatCompressFileDetectResultInfo(info):
        msg = "PATH: {}, \t\t RESULT: {}, SCORE: {}".format(info.path, info.result.name, info.score)
        vinfo = info.getVirusInfo()
        if vinfo is not None:
            msg += ", VIRUS_TYPE: {}, EXT_INFO: {}".format(vinfo.virus_type, vinfo.ext_info)
        return msg

    """
    Synchronously detect a directory or file
    @param path: The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
    @param is_sync: Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. True: synchronous, False: asynchronous
    """
    def detectDirOrFileSync(self, detector, path, timeout_ms, result_map):
        abs_path = os.path.abspath(path)
        if os.path.isdir(abs_path):
            sub_files = os.listdir(abs_path)
            if len(sub_files) == 0:
                return
            for sub_file in sub_files:
                sub_path = os.path.join(abs_path, sub_file)
                self.detectDirOrFileSync(detector, sub_path, timeout_ms, result_map)
            return

        print("[detectFileSync] [BEGIN] queueSize: {}, path: {}, timeout: {}".format(
            detector.getQueueSize(), abs_path, timeout_ms))
        res = self.detectFileSync(detector, abs_path, timeout_ms, True)
        print("                 [ END ] {}".format(Sample.formatDetectResult(res)))
        result_map[abs_path] = res
        return

    """
    Asynchronously detect a directory or file
    @param path: The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
    @param is_sync: Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. True: synchronous, False: asynchronous
    """
    def detectDirOrFile(self, detector, path, timeout_ms, callback):
        abs_path = os.path.abspath(path)
        if os.path.isdir(abs_path):
            sub_files = os.listdir(abs_path)
            if len(sub_files) == 0:
                return
            for sub_file in sub_files:
                sub_path = os.path.join(abs_path, sub_file)
                self.detectDirOrFile(detector, sub_path, timeout_ms, callback)
            return

        seq = self.detectFile(detector, abs_path, timeout_ms, True, callback)
        print("[detectFile] [BEGIN] seq: {}, queueSize: {}, path: {}, timeout: {}".format(
            seq, detector.getQueueSize(), abs_path, timeout_ms))
        return

    """
    Start detecting a file or directory
    @param path: The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
    @param is_sync: Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. True: synchronous, False: asynchronous
    """
    def scan(self, detector, path, detect_timeout_ms, is_sync):
        try:
            print("[SCAN] [START] path: {}, detect_timeout_ms: {}, is_sync: {}".format(path, detect_timeout_ms, is_sync))
            start_time = time.time()
            result_map = {}
            if is_sync:
                self.detectDirOrFileSync(detector, path, detect_timeout_ms, result_map)
            else:
                class AsyncTaskCallback(IDetectResultCallback):
                    def onScanResult(self, seq, file_path, callback_res):
                        print("[detectFile] [ END ] seq: {}, queueSize: {}, {}".format(seq,
                            detector.getQueueSize(), Sample.formatDetectResult(callback_res)))
                        result_map[file_path] = callback_res
                self.detectDirOrFile(detector, path, detect_timeout_ms, AsyncTaskCallback())
                # Wait for the task to complete.
                detector.waitQueueEmpty(-1)

            used_time_ms = (time.time() - start_time) * 1000
            print("[SCAN] [ END ] used_time: {}, files: {}".format(int(used_time_ms), len(result_map)))

            failed_count = 0
            white_count = 0
            black_count = 0
            for file_path, res in result_map.items():
                if res.isSucc():
                    if res.getDetectResultInfo().result == DetectResult.RESULT.RES_BLACK:
                        black_count += 1
                    else:
                        white_count += 1
                else:
                    failed_count += 1

            print("               fail_count: {}, white_count: {}, black_count: {}".format(
                failed_count, white_count, black_count))

        except Exception as e:
            print(traceback.format_exc(), file=sys.stderr)

    def main(self):

        # Get the detector instance.
        detector = OpenAPIDetector.get_instance()

        # Read the AccessKey ID and AccessKey Secret from environment variables.
        access_key_id = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID')
        access_key_secret = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')

        # Initialize.
        init_ret = detector.init(access_key_id, access_key_secret)
        print("INIT RET: {}".format(init_ret.name))

        # Set decompression parameters (optional, compressed packages are not decompressed by default).
        decompress = True # Specifies whether to identify and decompress compressed files. Default is false.
        decompressMaxLayer = 5 # Maximum decompression level. Effective when decompress is true.
        decompressMaxFileCount = 1000 # Maximum number of decompressed files. Effective when decompress is true.
        initdec_ret = detector.initDecompress(decompress, decompressMaxLayer, decompressMaxFileCount)
        print("INIT_DECOMPRESS RET: {}".format(initdec_ret.name))

        if True:
            # Example 1: Scan a local directory or file.
            is_sync_scan = False # Specifies whether to use asynchronous or synchronous detection. Asynchronous detection offers better performance. False indicates asynchronous detection.
            timeout_ms = 500000 # Detection time for a single sample, in milliseconds.
            path = "test.bin" # The file or directory to be scanned.
            # Start the scan and wait for it to finish.
            self.scan(detector, path, timeout_ms, is_sync_scan)

        if True:
            # Example 2: Scan a URL file.
            timeout_ms = 500000
            url = "https://xxxxxxxx.oss-cn-hangzhou-1.aliyuncs.com/xxxxx/xxxxxxxxxxxxxx?Expires=1671448125&OSSAccessKeyId=xxx" # The URL file to be scanned.
            md5 = "a767ffc59d93125c7505b6e21d000000"
            # Synchronous scan. To perform an asynchronous scan, call the detectUrl interface.
            print("[detectUrlSync] [BEGIN] URL: {}, MD5: {}, TIMEOUT: {}".format(url, md5, timeout_ms))
            result = self.detectUrlSync(detector, url, md5, timeout_ms, True)
            print("[detectUrlSync] [ END ] {}".format(Sample.formatDetectResult(result)))

        # Deinitialize.
        print("Over.")
        detector.uninit()

if __name__ == "__main__":
    sample = Sample()
    sample.main()

Etapa 4: Interpretar os resultados retornados

Após invocar o SDK para detectar arquivos maliciosos, visualize os resultados na saída do programa. Essas informações também são sincronizadas com o console do Security Center.

  • Estrutura de dados do resultado: Cada detecção retorna um objeto DetectResult. Os campos principais são:

    Campo

    Tipo

    Descrição

    md5

    String

    O valor de hash MD5 do arquivo.

    time

    long

    Tempo gasto nesta detecção (em milissegundos).

    error_code

    ERR_CODE

    Código de erro. ERR_SUCC indica sucesso.

    error_string

    String

    Informações detalhadas sobre o erro.

    result

    RESULT (enum)

    Enumeração do resultado da detecção:

    • RES_WHITE: Seguro

    • RES_BLACK: Suspeito/Malicioso

    • RES_PENDING: Pendente.

    score

    int

    Pontuação da detecção. Faixa: 0-100. Quanto maior a pontuação, maior o risco.

    • 0 ~ 60: Seguro. O arquivo é confiável e geralmente não requer ação.

    • 61 ~ 70: Risco (Baixo). O arquivo apresenta risco leve. Recomenda-se revisão manual.

    • 71 ~ 80: Suspeito (Médio). Provavelmente malicioso. Recomenda-se isolamento ou exclusão.

    • 81 ~ 100: Malicioso (Alto). Quase certamente malicioso. Isole ou exclua imediatamente.

    virus_type

    String

    Tipo de vírus, como WebShell, MalScript, Hacktool, entre outros.

    ext_info

    String

    Informações estendidas, geralmente uma string JSON contendo contexto mais detalhado da detecção.

    compresslist

    List

    Se o arquivo analisado for compactado e a descompactação estiver ativada, esta lista contém os resultados de detecção de cada arquivo dentro do pacote.

  • Códigos de erro e solução de problemas

    Código de erro

    Descrição

    Causa

    Solução sugerida

    ERR_SUCC

    Sucesso

    Detecção concluída com êxito.

    Nenhuma

    ERR_INIT

    Erro de inicialização

    O SDK precisa ser inicializado ou foi inicializado repetidamente.

    Certifique-se de que init() foi chamado com sucesso antes de invocar a interface de detecção.

    ERR_FILE_NOT_FOUND

    Arquivo não encontrado

    O caminho do arquivo local especificado não existe.

    Verifique se o caminho do arquivo está correto e se o programa possui permissões de leitura.

    ERR_CALL_API

    Erro na chamada da API

    Ocorreu um erro desconhecido ao chamar a API cloud.

    Revise o código e os valores dos parâmetros.

    ERR_TIMEOUT

    Timeout

    O tempo de detecção excedeu o timeout_ms configurado.

    Aumente o valor do parâmetro timeout_ms ou verifique a conexão de rede.

    ERR_UPLOAD

    Falha no upload

    Não foi possível fazer upload do arquivo para análise na nuvem. Tente novamente.

    Geralmente é um problema de rede. Recomendamos adicionar lógica de nova tentativa.

    ERR_ABORT

    Tarefa abortada

    O programa encerrou antes da conclusão da detecção. A cota pré-paga de detecções pode ter sido excedida ou o saldo da conta é insuficiente para pagamento conforme o uso.

    Adquira mais detecções ou recarregue sua conta.

    ERR_DETECT_QUEUE_FULL

    Fila de detecção cheia

    Tarefas de detecção foram enviadas com muita frequência e a fila no servidor está cheia.

    Isso pode ocorrer em horários de pico. Invoque waitQueueAvailable() para aguardar a liberação da fila ou tente novamente mais tarde.

    ERR_TIMEOUT_QUEUE

    Timeout na fila

    O tempo de espera na fila foi excessivo.

    ERR_MD5

    Erro de formato MD5

    O formato da string MD5 fornecida está incorreto.

    Corrija o formato do MD5.

    ERR_URL

    Erro de formato URL

    O formato da string URL fornecida está incorreto.

    Corrija o formato da URL.

Visualize e tratar resultados de detecção

  • Visualize os resultados

    • Aba At-risk File Overview:

      • Exibe centralmente todos os arquivos de risco detectados por todos os métodos (detecção OSS e chamadas de API). Pesquise, filtre arquivos de risco e visualize seus níveis de risco, tags de ameaça e outras informações.

      • Para arquivos compactados, clique em no ícone de expansão image antes do nome do arquivo para ver a lista de arquivos de risco dentro do pacote.

    • Aba OSS File Check/NAS File Detection:

      • Mostra estatísticas de risco por bucket ou sistema de arquivos, incluindo quantidade de arquivos de risco e progresso da detecção para cada item.

      • Na coluna Actions, clique em Details para visualize a lista associada de arquivos maliciosos.

  • Entrega de resultados: Se você ativou os recursos de Log Analysis ou Log Management do Security Center, os logs de detecção de arquivos maliciosos são armazenados automaticamente em um Logstore dedicado para consultas avançadas e análise de rastreamento. Para mais informações, consulte SAS log delivery e SIEM logs.

  • Trate os resultados: Execute operações nos resultados da detecção, incluindo Add to Whitelist, Ignore, Denied Access, entre outras. Para detalhes sobre as operações, consulte Handle malicious file detection results.

  • Configure notificações (opcional)

    O Security Center oferece recursos de notificação via robô DingTalk, permitindo enviar alertas de arquivos maliciosos detectados automaticamente para grupos do DingTalk, facilitando uma resposta rápida aos riscos. Siga o procedimento abaixo:

    1. Acesse o console do Security Center - System Settings - Notifications. No canto superior esquerdo da página, selecione a região dos seus ativos: Chinese Mainland ou Outside Chinese Mainland.

    2. Na aba DingTalk Chatbot, clique em Add Chatbot.

    Cotas e limites

    • Limites de tamanho de arquivo:

      • Tamanho total por tarefa: Sem limite.

      • Limite de tamanho por arquivo individual:

        • Detecção offline via SDK: arquivo único não pode exceder 100 MB.

        • Detecção de arquivos OSS via console: arquivo único não pode exceder 1 GB.

      • Descrição de excesso de limite:

        • Quando o tamanho do arquivo ultrapassa o limite ou os arquivos descompactados excedem a quantidade ou tamanho máximo, esses arquivos não serão analisados. Arquivos não detectados não contam para fins de faturamento.

        • Se as solicitações de detecção excederem a capacidade da fila, será necessário aguardar ou otimizar a capacidade de processamento simultâneo.

    • Limites para detecção de arquivos compactados: Até 5 níveis de descompactação, 1.000 arquivos e 1 GB de tamanho total.

    • Restrições de ambiente: Ambientes Financial Cloud e Government Cloud não são suportados.

    • Taxa padrão de requisições API (QPS): Versão de teste: 10 requisições/segundo. Versão paga: 20 requisições/segundo.

      Nota
      • A velocidade de detecção varia conforme condições de rede, desempenho do servidor, especificações de products cloud e outros fatores.

      • O SDK utiliza um mecanismo de fila assíncrona para lidar com picos de requisição e melhorar a concorrência. Quando a fila interna enche, novas requisições são pausadas até haver espaço disponível.

    • Faturamento

      A detecção de arquivos maliciosos (incluindo a detecção agêntica) é cobrada com base na quantidade de arquivos analisados (contagem de detecções). Utilize o modelo de assinatura para ative a Detecção de Arquivos Maliciosos ou o pagamento conforme o uso para ative a Detecção Agêntica de Arquivos Maliciosos.

      • Preços:

        • Assinatura (Detecção de Arquivos Maliciosos): USD 1,5 por 10.000 detecções mensais. A assinatura suporta apenas o recurso básico de detecção de arquivos maliciosos. Detecção por modelos de IA, detecção de arquivos Skill e detecção de arquivos NAS não são suportadas.

        • Pagamento conforme o uso (Detecção Agêntica de Arquivos Maliciosos): USD 0,0012 por arquivo. O pagamento conforme o uso oferece todas as capacidades da detecção agêntica. Além da detecção básica, inclui detecção por modelos de IA, detecção de arquivos Skill e detecção de arquivos NAS.

          Nota

          Ao ative o service de pagamento conforme o uso, o sistema cobra uma taxa base adicional de service (USD 0,0072 por hora).

      • Faturamento de arquivos compactados: Se a detecção de arquivos compactados estiver ativada, as detecções consumidas são calculadas com base na quantidade de arquivos descompactados.

        Exemplo: Analisar um pacote compactado contendo 1.000 pequenos arquivos conta como 1.000 arquivos e consome 1.000 detecções.

      • Tratamento de resultados de detecção: Incluído na taxa do service. Sem cobrança adicional.

      • Nota

        Para mais detalhes sobre modelos e lógica de faturamento, consulte Subscription e Pay-as-you-go.

        Solução de problemas

        • Lista de buckets vazia ou bucket alvo não encontrado

          • Causa: A região do bucket não está entre as regiões suportadas para detecção de arquivos maliciosos.

            Solução: Confirme se a região do bucket consta na lista de regiões suportadas em Scope. Se não for suportada, copie os arquivos para um bucket em uma região compatível.

          • Causa: A lista de buckets não foi sincronizada.

            Solução: Na aba OSS File Check, clique em Synchronize Buckets para sincronizar a lista mais recente de buckets.

        • Permissões insuficientes ou falha na autorização

          • Causa: A função vinculada ao service do Security Center não foi criada ou a política de permissões está incompleta.

          • Solução: Certifique-se de que a conta Alibaba Cloud atual possui permissões de gerenciamento RAM. Ao ative a detecção de arquivos maliciosos pela primeira vez, o sistema cria automaticamente a função vinculada ao service AliyunServiceRoleForSasFileDetect. Para crie manualmente, consulte Create a RAM user.

        • Impossível iniciar tarefa de detecção ou cota insuficiente

          • Causa: O pacote de recursos de assinatura expirou ou o saldo da conta de pagamento conforme o uso é insuficiente.

            Solução: Acesse a página Overview do Security Center para verificar a contagem de detecções disponível. Se for insuficiente, consulte Security Center purchase page para renovar ou recarregar.

          • Causa: A fila de detecção está cheia, excedendo o limite de QPS.

            Solução: O QPS padrão é de 10 requisições/segundo na versão de teste e 20 requisições/segundo na versão paga. Reduza a frequência de concorrência ou tente novamente mais tarde.

        • Arquivos criptografados não podem ser detectados

          • Causa: O arquivo OSS utiliza um método de criptografia não suportado ou o método de descriptografia foi selecionado incorretamente.

          • Solução: A detecção de arquivos maliciosos suporta apenas criptografia no lado do servidor do OSS (SSE-KMS, SSE-OSS). Selecione o File Decryption Type correspondente ao método de criptografia do arquivo. Criptografia no lado do cliente ou arquivos criptografados por terceiros não são suportados.

        FAQ

        Faturamento e cota

        • É possível reembolsar detecções de arquivos já utilizadas?

          Não. Antes de iniciar a detecção, confirme o escopo de arquivos e a política de detecção para evitar desperdício de cotas por operação incorreta.

        • Por que "Total Files" e "Detected Total Files" divergem na aba de detecção de arquivos OSS?

          • Total Files: Quantidade natural de arquivos no bucket (um pacote compactado conta como 1).

          • Detected Total Files: Número real de arquivos escaneados. Se a verificação de arquivos compactados estiver ativada, os arquivos internos também são contabilizados. O total depende das configurações de Decompression Level e quantidade máxima de arquivos descompactados. Esse valor representa o acumulado de todas as tarefas históricas de detecção no bucket atual, não apenas de uma única execução. Mesmo que arquivos tenham sido excluídos, seus registros históricos continuam contando no total acumulado, podendo resultar em um número maior que a quantidade atual de arquivos no bucket.

          Ao escanear um pacote compactado com muitos arquivos, "Detected Total Files" será muito superior a "Total Files". O faturamento baseia-se na quantidade real de arquivos detectados.

        • O que fazer se a tarefa de detecção for interrompida por cota insuficiente?

          No modelo de assinatura, a tarefa de varredura é interrompida quando as detecções restantes são insuficientes. Consulte as soluções abaixo:

          • Cancele a tarefa de varredura atual: Na página OSS File Check, localize o bucket em análise e clique em no botão Cancel Detection na linha correspondente para cancele a tarefa atual.

          • Atualizar configuração: Acesse a página console do Security Center - Overview. Na seção Subscription, clique em Change Configuration>Upgrade Now para adquirir detecções adicionais. Para mais informações, consulte Upgrade or downgrade.

          • Modifique política de detecção: Desative a descompactação de arquivos compactados nas configurações de detecção para reduzir o consumo por tarefa e execute a varredura novamente.

            Se você não cancele a tarefa atual e apenas renovar continuando a varredura, o sistema ainda descompactará e analisará os arquivos do pacote, consumindo sua cota continuamente.

        Gerenciamento de autorizações

        • Como visualize os detalhes de autorização do SDK de arquivos maliciosos (como contagem restante e data de expiração)?

          Visualize a Personal SDK Authorization da conta atual no console, incluindo versão, status de ativação, limites de autorização, contagem restante, limites de taxa e data de expiração.

          1. Acesse o console do Security Center - Risk Governance - Malicious File Detection. No canto superior esquerdo da página, selecione a região dos seus ativos: Chinese Mainland ou Outside Chinese Mainland.

          2. Clique em SDK and Permissions no canto superior direito.

        • O que fazer ao receber o aviso "Malicious file detection SDK purchased but not yet used" ou "Notification not configured"?

          • Comprado, mas ainda não utilizado: Significa que a cota de detecção foi adquirida, mas nenhuma tarefa foi executada. Consulte a seção "Configure e execute tarefas de detecção" neste tópico para realizar uma detecção manual via console ou integrar o SDK para iniciar a análise.

          • Notificação não configurada: Indica que as notificações de resultados não foram configuradas, o que não afeta o funcionamento da detecção. Para receber alertas quando arquivos maliciosos forem detectados, siga as instruções na seção "Configure notificações (opcional)" deste tópico. Após a configuração, o aviso desaparecerá.

        • Preciso configure uma política de detecção se a detecção falhar ao usar API ou SDK?

          Ao invocar a detecção de arquivos maliciosos via API ou SDK, não é necessário configure uma política de detecção no console. Políticas de detecção aplicam-se apenas à detecção automática de arquivos armazenados em buckets do Alibaba Cloud Object Storage Service (OSS) ou sistemas de arquivos NAS através do console.

          Se uma chamada de API falhar, solucione o problema conforme abaixo:

          1. Certifique-se de que o usuário Resource Access Management (RAM) recebeu a política de acesso AliyunYundunSASFullAccess. Sem essa autorização, a API retorna Forbidden.NoPermission.

          2. Verifique se o AccessKey está configurado nas variáveis de ambiente ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET.

          3. Se o código de erro ERR_CALL_API for retornado, revise o código e os valores dos parâmetros.

          4. Caso receba o código de erro ERR_INIT, garanta que init() seja chamado antes da operação de detecção.

        Apêndice

        Referência de API

        Utilize o recurso de detecção de arquivos maliciosos invocando operações de API. Alguns documentos de referência estão listados abaixo:

        Tipos de vírus suportados

        Tipo de vírus (virus_type)

        Nome do vírus

        Backdoor

        Backdoor de reverse shell

        DDoS

        Trojan DDoS

        Downloader

        Trojan downloader

        Engtest

        Programa de teste de motor

        Hacktool

        Ferramenta de hacking

        Trojan

        Programa de alto risco

        Malbaseware

        Software base contaminado

        MalScript

        Script malicioso

        Malware

        Malware

        Miner

        Programa de mineração

        Proxytool

        Ferramenta de proxy

        RansomWare

        Ransomware

        RiskWare

        Riskware

        Rootkit

        Rootkit

        Stealer

        Stealer

        Scanner

        Scanner

        Suspicious

        Programa suspeito

        Virus

        Vírus infeccioso

        WebShell

        Web shell

        Worm

        Worm

        AdWare

        Adware

        Patcher

        Patcher

        Gametool

        Ferramenta de jogo