Tous les produits
Search
Centre de documentation

Security Center:Malicious file detection

Dernière mise à jour :Sep 06, 2026

La détection de fichiers malveillants est un service de sécurité des fichiers proposé par Security Center. Il permet de détecter les fichiers malveillants, tels que les ransomwares, les programmes de minage et les web shells, qui peuvent être introduits lors de scénarios métier comme le téléchargement de fichiers, le déploiement de code ou le partage de données, protégeant ainsi vos systèmes et vos données contre les menaces. S’appuyant sur une plateforme de détection multi-moteurs, ce service identifie les fichiers malveillants dans Object Storage Service (OSS) et sur les serveurs, et propose plusieurs méthodes de détection, notamment via la console ou l’intégration d’un SDK. La Détection agentique de fichiers malveillants, activée en mode paiement à l'utilisation, prend également en charge la détection par modèle de langage large (LLM) basé sur l’IA, la détection de fichiers Skill et la détection de fichiers NAS. Cette rubrique aide les utilisateurs aux profils variés à choisir rapidement la méthode de détection la plus adaptée à leurs besoins métier.

Avant de commencer

Vous avez activé la détection de fichiers malveillants. Les fonctionnalités de détection disponibles varient selon le mode de facturation choisi lors de l’activation du service.

  • Si vous activez la détection de fichiers malveillants en mode Abonnement, vous pouvez utiliser les fonctionnalités de base telles que la détection multi-moteurs, la détection des fichiers compressés et la détection des fichiers chiffrés. La détection par modèle de langage large (LLM) basé sur l’IA, la détection de fichiers Skill et la détection de fichiers NAS ne sont pas prises en charge.

  • Si vous activez la Détection agentique de fichiers malveillants en mode Paiement à l'utilisation, vous bénéficiez, en plus des capacités de détection de fichiers malveillants standard, de la détection par modèle de langage large (LLM) basé sur l’IA, de la détection de fichiers Skill et de la détection de fichiers NAS.

Périmètre

  • Types de fichiers pris en charge

    • Détection des fichiers compressés : prend en charge la décompression et l’analyse des archives compressées non chiffrées. Le niveau de décompression et le nombre de fichiers sont configurables. Cette configuration s’applique uniquement aux fichiers OSS.

    • Détection des fichiers chiffrés : prend en charge le déchiffrement automatique et l’analyse des données chiffrées avec le chiffrement côté serveur OSS (SSE-KMS, SSE-OSS). Cela s’applique uniquement aux fichiers OSS.

    • Détection des fichiers NAS (uniquement en mode Paiement à l'utilisation) : prend en charge la détection des fichiers dans Apsara File Storage NAS. Les types de système de fichiers, les zones et les limites pris en charge dépendent de l’affichage dans la console.

    • Détection des fichiers Skill (uniquement en mode Paiement à l'utilisation) : offre des capacités de détection spécialisées pour les fichiers Skill, couvrant davantage de formats de fichiers et de scénarios d’attaque.

  • Formats de fichiers pris en charge : plusieurs types de fichiers sont pris en charge, tels que les archives compressées, les scripts/web shells, les images et les exécutables/fichiers binaires. Seuls les types courants sont répertoriés ici. Pour la liste complète des types pris en charge, consultez l’affichage dans la console.

    • Archives compressées : .7z, .zip, .rar, .tar, .gz, .bz2, .xz, .lzma, .ar, .tar.gz, etc.

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

    • Documents : .doc, .pdf, .ppt, .xsl, .rtf, .hta, .chm, .docx, etc.

    • Images : .jpg, .jpeg, .png, etc.

    • Exécutables et binaires : .apk, .exe, .dll, .ocx, .com, .so, .sys, .ko, .obj, etc.

  • Types de virus pris en charge : prend en charge la détection des backdoors de type reverse shell, des chevaux de Troie DDoS, des programmes de minage et d’autres fichiers virus. Pour plus d’informations, consultez les Types de virus pris en charge.

  • Restrictions liées à la classe de stockage : seuls les fichiers stockés dans OSS avec la classe de stockage Standard ou Infrequent Access peuvent être analysés. La classe de stockage Archive n’est pas prise en charge.

  • Régions prises en charge :

    • Chine (Qingdao), Chine (Pékin), Chine (Zhangjiakou), Chine (Hohhot), Chine (Ulanqab)

    • Chine (Hangzhou), Chine (Shanghai)

    • Chine (Shenzhen), Chine (Heyuan), Chine (Guangzhou)

    • Chine (Chengdu), Chine (Hong Kong)

    • Singapour, Malaisie (Kuala Lumpur), Indonésie (Jakarta), Philippines (Manille), Thaïlande (Bangkok), Japon (Tokyo), Corée du Sud (Séoul), États-Unis (Silicon Valley), États-Unis (Virginie), Allemagne (Francfort), Royaume-Uni (Londres)

Configurer et exécuter des tâches de détection

Security Center propose deux méthodes pour effectuer des tâches de détection : les opérations via la console et l'intégration du SDK.

Fonctionnalité

Opération via la console

Intégration du SDK

Mode d'utilisation

Connectez-vous à la console Security Center et effectuez les opérations dans une interface graphique.

Intégrez et appelez le SDK dans votre code métier. Java et Python sont pris en charge.

Fichiers pris en charge

Prend en charge les fichiers Object Storage Service (OSS) et les fichiers Apsara File Storage NAS. Différents onglets affichent les listes de ressources correspondantes, et les opérations sont identiques.

Remarque

La détection de fichiers NAS est prise en charge uniquement lorsque vous utilisez le paiement à l'utilisation (Détection de fichiers malveillants Agentic).

  • Fichiers serveur : Peuvent être directement accessibles et traités, tels que les fichiers téléchargés par les utilisateurs en temps réel ou des fichiers locaux spécifiques sur le serveur.

  • Fichiers OSS : Générez une URL de téléchargement valide pour les fichiers stockés dans OSS afin que le système puisse les extraire et les détecter.

  • Fichiers NAS (paiement à l'utilisation uniquement) : Générez un chemin d'accès valide ou une URL de téléchargement pour les fichiers stockés dans NAS afin que le système puisse les extraire et les détecter.

Opérations via la console

Si les fichiers à détecter sont stockés dans des compartiments OSS, vous pouvez scanner directement les fichiers dans les compartiments OSS ciblés par lots ou de manière périodique dans la console Security Center.

  • Détection manuelle : Cette méthode convient pour l'analyse ponctuelle des fichiers existants. Elle prend en charge la détection complète et la détection incrémentielle.

  • Détection automatique : Cette méthode est adaptée à l'analyse automatique continue des nouveaux fichiers ajoutés.

Détection manuelle (fichiers existants)

  1. Accédez à la page de détection de fichiers

    Accédez à la console Security Center - Gouvernance des risques - Détection de fichiers malveillants. Dans le coin supérieur gauche de la page, sélectionnez la région de vos ressources : Chinese Mainland ou Outside Chinese Mainland.

  2. Démarrez une tâche de détection

    OSS File Check

    1. Cliquez sur l'onglet OSS File Check.

    2. Synchronisez les fichiers (facultatif) : Si le compartiment ne figure pas dans la liste OSS File Check, cliquez sur Synchronize Buckets pour synchroniser la dernière liste des compartiments.

    3. Créez une tâche de détection :

      • Détection complète :

        • Description : Détecte tous les fichiers dans un ou plusieurs compartiments.

        • Point d'entrée de l'opération :

          • Détection unique : Dans la colonne Actions du compartiment cible, cliquez sur Check.

          • Détection par lot : Sélectionnez plusieurs compartiments et cliquez sur Batch Check sous la liste.

      • Détection incrémentielle

        • Description : Pour les compartiments déjà détectés et ayant subi des mises à jour de fichiers depuis la dernière détection, seuls les fichiers ajoutés ou modifiés depuis la dernière tâche sont détectés.

        • Point d'entrée de l'opération : Dans la colonne Actions du compartiment cible, cliquez sur Incremental Check.

    4. Configurez les paramètres de détection : Dans la boîte de dialogue qui s'affiche, configurez les paramètres suivants.

      • File Check Type : Sélectionnez les extensions de fichier à scanner. Par défaut, tous les types de fichiers sont détectés.

      • Decompression Level et Max Files per Archive : Si vous souhaitez scanner le contenu des packages compressés, définissez le niveau de décompression (jusqu'à 5 niveaux) et le nombre de fichiers dans un seul package compressé (jusqu'à 1 000). Par défaut, la décompression est désactivée.

      • File Decryption Type : Si les fichiers OSS utilisent le chiffrement côté serveur (SSE-OSS ou SSE-KMS), sélectionnez la méthode de déchiffrement correspondante afin que Security Center puisse déchiffrer et détecter les fichiers.

      • Étendue des fichiers de détection : Sélectionnez la plage de dates et d'heures pour la détection. Seuls les fichiers compris dans cette plage sont scannés.

      • Scan Path :

        • Match by Prefix : Saisissez un préfixe de nom de fichier pour scanner des fichiers spécifiés.

        • Configure for Entire Bucket : Scannez tous les fichiers du compartiment.

    NAS File Detection (paiement à l'utilisation uniquement)

    1. Cliquez sur l'onglet NAS File Detection.

    2. Synchronisez les fichiers (facultatif) : Si le système de fichiers ne figure pas dans la liste NAS File Detection, cliquez sur Synchronize File System pour synchroniser la dernière liste des systèmes de fichiers.

    3. Créez une tâche de détection :

      • Détection complète :

        • Description : Détecte tous les fichiers dans un ou plusieurs systèmes de fichiers.

        • Point d'entrée de l'opération :

          • Détection unique : Dans la colonne Actions du système de fichiers cible, cliquez sur Check.

          • Détection par lot : Sélectionnez plusieurs systèmes de fichiers et cliquez sur Batch Check sous la liste.

      • Détection incrémentielle

        • Description : Pour les systèmes de fichiers déjà détectés et ayant subi des mises à jour de fichiers depuis la dernière détection, seuls les fichiers ajoutés ou modifiés depuis la dernière tâche sont détectés.

        • Point d'entrée de l'opération : Dans la colonne Actions du système de fichiers cible, cliquez sur Incremental Check.

    4. Configurez les paramètres de détection : Dans la boîte de dialogue qui s'affiche, configurez les paramètres suivants.

      • File Check Type : Sélectionnez les extensions de fichier à scanner. Par défaut, tous les types de fichiers sont détectés.

      • Detection File Scope : Sélectionnez la plage de dates et d'heures pour la détection. Seuls les fichiers compris dans cette plage sont scannés.

  3. Attendez la fin de la tâche de détection : Vous pouvez consulter le File Check Status cible sur la page de liste des compartiments ou des systèmes de fichiers. Lorsque le statut passe de Not Checked à Checked, la détection est terminée.

    Remarque

    Une fois la tâche de détection terminée, les statistiques de données et la synchronisation sont effectuées en arrière-plan. Les résultats accusent généralement un délai de 1 à 2 heures. Veuillez patienter.

Détection automatique (fichiers incrémentiels)

  1. Accédez à la page de gestion des politiques

    1. Accédez à la console Security Center - Gouvernance des risques - Détection de fichiers malveillants. Dans le coin supérieur gauche de la page, sélectionnez la région de vos ressources : Chinese Mainland ou Outside Chinese Mainland.

    2. Cliquez sur Policy Management dans le coin supérieur droit.

  2. Créez ou modifiez une politique de détection

    • Créez une nouvelle politique : Dans le panneau Policy Management, cliquez sur Create Policy.

    • Modifiez une politique existante : Dans la colonne Actions de la politique cible, cliquez sur Edit pour ajouter le compartiment ou le système de fichiers cible à la portée effective de la politique.

  3. Configurez les informations de base : Sur la page Policy Configuration, configurez les informations de base de la politique.

    • Effective Products : Sélectionnez OSS.

    • Policy Name : Saisissez un nom de politique.

    • Policy Status : Activez ou désactivez la politique.

    • Produit effectif : Sélectionnez OSS/NAS.

  4. Configurez les détails de la politique : Les éléments de configuration varient selon le produit effectif. Configurez les paramètres en fonction du produit que vous avez sélectionné.

    Politique OSS

    • Increment Real-time Detection :

      Remarque

      La détection incrémentielle en temps réel peut être configurée uniquement dans les régions Chinese Mainland. Elle n'est pas prise en charge dans les régions Outside Chinese Mainland.

      • Activer : Lorsqu'un nouveau fichier est téléchargé dans le compartiment spécifié, la détection est immédiatement déclenchée.

      • Désactiver : Scanne les nouveaux fichiers ajoutés en fonction du cycle de détection configuré (par exemple, tous les jours ou tous les 3 jours) et de l'heure de détection des fichiers (par exemple, 02:00-04:00).

    • Scan Path : Sélectionnez la correspondance par préfixe ou appliquez à l'ensemble du compartiment.

    • Étendue des fichiers de détection : Sélectionnez la plage de dates et d'heures pour la détection. Seuls les fichiers compris dans cette plage sont scannés.

    • File Check Type : Sélectionnez les extensions de fichier à scanner. Par défaut, tous les types de fichiers sont détectés.

    • Decompression Level et Max Files per Archive : Si vous souhaitez scanner le contenu des packages compressés, définissez le niveau de décompression (jusqu'à 5 niveaux) et le nombre de fichiers dans un seul package compressé (jusqu'à 1 000). Par défaut, la décompression est désactivée.

    • File Decryption Type : Si les fichiers OSS utilisent le chiffrement côté serveur (SSE-OSS ou SSE-KMS), sélectionnez la méthode de déchiffrement correspondante afin que Security Center puisse déchiffrer et détecter les fichiers.

    • Effective Bucket : Sélectionnez un ou plusieurs compartiments auxquels cette politique s'applique. Si le compartiment cible est déjà utilisé par une autre politique, il ne peut pas être sélectionné à nouveau.

      Avertissement

      Une fois la politique activée, les fichiers des nouveaux compartiments ajoutés ne sont pas automatiquement détectés. Si vous devez les détecter, modifiez manuellement la politique et ajoutez-les à la liste Effective Bucket.

    Politique NAS (paiement à l'utilisation uniquement)

    • Detection Cycle : Sélectionnez le cycle d'exécution de la tâche de détection.

    • Check Time : Sélectionnez l'heure d'exécution de la tâche de détection. L'intervalle ne peut pas être inférieur à 1 heure.

      Avertissement

      Si la tâche de détection dépasse l'heure de détection configurée, elle est automatiquement mise en pause et redémarrée lors du prochain cycle de détection.

    • Detection File Scope : Sélectionnez la plage de dates et d'heures pour la détection. Seuls les fichiers compris dans cette plage sont scannés.

    • File Check Type : Sélectionnez les extensions de fichier à scanner. Par défaut, tous les types de fichiers sont détectés.

    • Effective File System : Sélectionnez un ou plusieurs systèmes de fichiers NAS auxquels cette politique s'applique. Si le système de fichiers cible est déjà utilisé par une autre politique, il ne peut pas être sélectionné à nouveau.

  5. Une fois la configuration terminée, cliquez sur OK.

Intégration du SDK

Intégrez le service de détection de fichiers malveillants dans votre code métier pour obtenir des informations sur les fichiers malveillants à partir des résultats renvoyés et mettre en œuvre la détection de fichiers. La détection de fichiers malveillants Agentic activée en mode paiement à l'utilisation fournit également la détection par modèle de langage large IA, la détection de fichiers Skill et d'autres capacités.

Étape 1 : Préparez les identifiants d'accès et les autorisations

  1. Créez une clé d'accès

    Pour garantir la sécurité du compte, n'utilisez pas l'AccessKey de votre compte Alibaba Cloud. Nous vous recommandons de créer un utilisateur RAM dédié pour l'accès API et de lui accorder les autorisations minimales requises. Pour plus d'informations, consultez Créer un utilisateur RAM et Créer une AccessKey.

    Créer un nouveau compte

    1. Connectez-vous à la console RAM en utilisant votre compte Alibaba Cloud ou un compte administrateur RAM. Sur la page Users, cliquez sur Create User.

    2. Effectuez la configuration en fonction des informations suivantes :

      1. User Account Information : Saisissez un nom de connexion, des tags et d'autres informations.

      2. Direct Access : Sélectionnez Use Permanent AccessKey to Access.

    3. Effectuez la vérification de sécurité. Le système génère automatiquement un AccessKey ID et un AccessKey Secret pour l'utilisateur RAM. Conservez les informations de clé en toute sécurité.

      Remarque

      Vous pouvez télécharger le fichier CSV de la clé ou copier le contenu et l'enregistrer localement. Pour plus d'informations, consultez Créer une paire de clés AccessKey.

    Compte RAM existant

    1. Connectez-vous à la console RAM en utilisant votre compte Alibaba Cloud ou un compte administrateur RAM, et accédez à la page de détails de l'utilisateur cible.

    2. Sur l'onglet Logon-free Configuration, dans la section AccessKey Pair, cliquez sur Create AccessKey.

    3. Sélectionnez un scénario d'utilisation en fonction de vos besoins métier, cochez I confirm that I must create an AccessKey pair, puis cliquez sur Continue to Create.

    4. Effectuez la vérification de sécurité. Le système génère automatiquement un AccessKey ID et un AccessKey Secret pour l'utilisateur RAM. Conservez les informations de clé en toute sécurité.

      Remarque

      Vous pouvez télécharger le fichier CSV de la clé ou copier le contenu et l'enregistrer localement. Pour plus d'informations, consultez Créer une AccessKey.

  2. Configurez les politiques d'autorisation

    1. Sur la page Users, cliquez sur l'utilisateur RAM cible. Dans la colonne Actions, cliquez sur Grant permissions to the user..

    2. Dans la section Policy, sélectionnez AliyunYundunSASFullAccess, puis cliquez sur Confirm Authorization.

      Remarque

      Pour plus d'informations, consultez Accorder des autorisations à un utilisateur RAM.

  3. Configurez les variables d'environnement

    Les SDK Alibaba Cloud prennent en charge la création d'identifiants d'accès par défaut en définissant les variables d'environnement ALIBABA_CLOUD_ACCESS_KEY_ID et ALIBABA_CLOUD_ACCESS_KEY_SECRET. Lorsque vous appelez une API, le programme accède directement aux identifiants, lit la clé d'accès (AccessKey) et effectue automatiquement l'authentification. Pour plus d'informations, consultez Configurer les variables d'environnement.

    Linux/macOS

    • Configurez l'AccessKey ID et appuyez sur Entrée.

      # Replace yourAccessKeyID with your AccessKey ID.
      export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID
    • Configurez l'AccessKey secret et appuyez sur Entrée.

      # Replace yourAccessKeySecret with your AccessKey secret.
      export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret
    • Vérifiez la configuration.

      Exécutez la commande echo $ALIBABA_CLOUD_ACCESS_KEY_ID. Si la commande renvoie l'AccessKey ID correct, la configuration est réussie.

    Windows

    Utiliser l'interface graphique (GUI)

    • Procédure

      Les étapes suivantes décrivent comment définir les variables d'environnement à l'aide de l'interface graphique dans Windows 10.

      Sur votre bureau, faites un clic droit sur This PC et choisissez Properties > Advanced system settings > Environment Variables > New sous System variables ou User variables. Ensuite, effectuez la configuration.

      Variable

      Valeur d'exemple

      AccessKey ID

      • Nom de la variable : ALIBABA_CLOUD_ACCESS_KEY_ID

      • Valeur de la variable : yourAccessKeyID

      AccessKey secret

      • Nom de la variable : ALIBABA_CLOUD_ACCESS_KEY_SECRET

      • Valeur de la variable : yourAccessKeySecret

    • Testez la configuration

      Cliquez sur Start (ou utilisez le raccourci clavier Win+R), cliquez sur Run, saisissez cmd, puis cliquez sur OK (ou appuyez sur Entrée) pour ouvrir l'invite de commandes. Exécutez les commandes echo %ALIBABA_CLOUD_ACCESS_KEY_ID% et echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Si les commandes renvoient l'AccessKey correct, la configuration est réussie.

    Utiliser l'invite de commandes (CMD)

    • Procédure

      Ouvrez l'invite de commandes en tant qu'administrateur et exécutez les commandes suivantes pour ajouter de nouvelles variables d'environnement au système.

      setx ALIBABA_CLOUD_ACCESS_KEY_ID yourAccessKeyID /M
      setx ALIBABA_CLOUD_ACCESS_KEY_SECRET yourAccessKeySecret /M

      Le paramètre /M indique une variable d'environnement système. Vous pouvez omettre ce paramètre lorsque vous définissez une variable d'environnement utilisateur.

    • Testez la configuration

      Cliquez sur Start (ou utilisez le raccourci clavier Win+R), cliquez sur Run, saisissez cmd, puis cliquez sur OK (ou appuyez sur Entrée) pour ouvrir l'invite de commandes. Exécutez les commandes echo %ALIBABA_CLOUD_ACCESS_KEY_ID% et echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Si les commandes renvoient l'AccessKey correct, la configuration est réussie.

    Utiliser Windows PowerShell

    Dans PowerShell, vous pouvez définir de nouvelles variables d'environnement valables pour toutes les nouvelles sessions :

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

    Pour définir des variables d'environnement pour tous les utilisateurs, vous devez disposer des autorisations d'administrateur :

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

    Vous pouvez définir des variables d'environnement temporaires valables uniquement pour la session actuelle :

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

    Dans PowerShell, exécutez les commandes Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_ID et Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_SECRET. Si les commandes renvoient l'AccessKey correct, la configuration est réussie.

Étape 2 : Installer le SDK

Sélectionnez la méthode d'installation en fonction de votre langage de développement. Seuls Java et Python sont pris en charge actuellement.

Java

  • Prérequis : JDK 1.8 ou version ultérieure.

  • Installation :

    1. Accédez au référentiel du SDK Java pour télécharger la dernière version du fichier du SDK Java.

    2. Ajoutez le fichier SDK téléchargé à votre projet.

Python

  • Prérequis : Python 3.6 ou version ultérieure.

  • Installation :

    • Installation en ligne : effectuez une installation rapide à l'aide de pip.

      <BASH>
      
      pip install -U alibabacloud_filedetect
    • Installation hors ligne :

      1. Dans un environnement connecté, accédez au référentiel du SDK Python pour télécharger la dernière version du SDK Python.

      2. Téléchargez le package source dans votre environnement de projet et décompressez-le.

      3. Accédez au répertoire racine du SDK décompressé et exécutez la commande d'installation :

        <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

Étape 3 : Rédigez le code et lancez la détection

Une fois l'environnement configuré, reportez-vous aux exemples de code Python et Java suivants pour rédiger votre propre code.

Important

Remplacez les paramètres path, URL et MD5 dans l'exemple de code par vos valeurs réelles.

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()

Étape 4 : Analyser les résultats renvoyés

Après avoir appelé le SDK pour détecter les fichiers malveillants, vous pouvez consulter les résultats de la détection dans la sortie du programme. Les résultats sont également synchronisés avec la console Security Center.

  • Structure des données de résultat : Chaque détection renvoie un objet DetectResult. Les champs principaux sont les suivants :

    Champ

    Type

    Description

    md5

    String

    Valeur de hachage MD5 du fichier.

    time

    long

    Temps utilisé pour cette détection (en millisecondes).

    error_code

    ERR_CODE

    Code d'erreur. ERR_SUCC indique un succès.

    error_string

    String

    Informations détaillées sur l'erreur.

    result

    RESULT (enum)

    Énumération des résultats de détection :

    • RES_WHITE : Sûr

    • RES_BLACK : Suspect/Malveillant

    • RES_PENDING : En attente.

    score

    int

    Score de détection. Plage : 0-100. Un score plus élevé indique un risque plus important.

    • 0 ~ 60 : Sûr. Le fichier est fiable et ne nécessite généralement aucune action.

    • 61 ~ 70 : Risque (Faible). Le fichier présente un risque mineur. Une révision manuelle est recommandée.

    • 71 ~ 80 : Suspect (Moyen). Le fichier est probablement malveillant. L'isolation ou la suppression est recommandée.

    • 81 ~ 100 : Malveillant (Élevé). Le fichier est presque certainement malveillant. Isolez-le ou supprimez-le immédiatement.

    virus_type

    String

    Type de virus, tel que WebShell, MalScript, Hacktool, etc.

    ext_info

    String

    Informations étendues, généralement une chaîne JSON contenant un contexte de détection plus détaillé.

    compresslist

    List

    Si le fichier détecté est un fichier compressé et que la décompression est activée, cette liste contient les résultats de détection de chaque fichier dans le package compressé.

  • Codes d'erreur et dépannage

    Code d'erreur

    Description

    Cause

    Solution suggérée

    ERR_SUCC

    Succès

    La détection s'est terminée avec succès.

    Aucune

    ERR_INIT

    Erreur d'initialisation

    Le SDK doit être initialisé ou a été initialisé à plusieurs reprises.

    Assurez-vous que init() a été appelé avec succès avant d'appeler l'interface de détection.

    ERR_FILE_NOT_FOUND

    Fichier introuvable

    Le chemin d'accès au fichier local spécifié n'existe pas.

    Vérifiez si le chemin d'accès au fichier est correct et si le programme dispose des autorisations de lecture de fichier.

    ERR_CALL_API

    Erreur d'appel API

    Une erreur inconnue s'est produite lors de l'appel de l'API cloud.

    Vérifiez le code et les valeurs des paramètres.

    ERR_TIMEOUT

    Délai dépassé

    Le temps de détection a dépassé la valeur timeout_ms configurée.

    Augmentez la valeur du paramètre timeout_ms ou vérifiez la connexion réseau.

    ERR_UPLOAD

    Échec du téléchargement

    Le téléchargement du fichier vers le cloud pour analyse a échoué. Vous pouvez réessayer.

    Il s'agit généralement d'un problème réseau. Nous vous recommandons d'ajouter une logique de nouvelle tentative.

    ERR_ABORT

    Tâche abandonnée

    Le programme s'est arrêté avant la fin de la détection. Le nombre de fichiers détectés a peut-être dépassé le quota prépayé, ou le solde du compte est insuffisant pour la facturation au paiement à l'utilisation.

    Achetez des comptes de détection supplémentaires ou rechargez votre compte.

    ERR_DETECT_QUEUE_FULL

    File d'attente de détection pleine

    Les tâches de détection ont été soumises trop fréquemment et la file d'attente côté serveur est pleine.

    Cela peut se produire pendant les heures de pointe. Vous pouvez appeler waitQueueAvailable() pour attendre que la file d'attente soit disponible, ou réessayer plus tard.

    ERR_TIMEOUT_QUEUE

    Délai d'attente de la file d'attente dépassé

    Le temps d'attente dans la file d'attente était trop long.

    ERR_MD5

    Erreur de format MD5

    Le format de la chaîne MD5 fournie est incorrect.

    Corrigez le format MD5.

    ERR_URL

    Erreur de format URL

    Le format de la chaîne URL fournie est incorrect.

    Corrigez le format URL.

Afficher et traiter les résultats de détection

  • Afficher les résultats

    • Onglet At-risk File Overview :

      • Affiche de manière centralisée tous les fichiers à risque détectés par toutes les méthodes de détection (détection OSS et appels API). Vous pouvez rechercher et filtrer les fichiers à risque, et consulter leurs niveaux de risque, tags de menace et autres informations.

      • Pour les fichiers compressés, cliquez sur l'icône de développement image située avant le fichier pour afficher la liste des fichiers à risque dans le package.

    • Onglets OSS File Check / NAS File Detection :

      • Affiche les statistiques de risque par bucket ou système de fichiers, telles que le nombre de fichiers à risque et la progression de la détection pour chaque bucket ou système de fichiers.

      • Vous pouvez cliquer sur la colonne Actions puis sur Details pour afficher la liste des fichiers malveillants associés.

  • Distribution des résultats : Si vous avez activé les fonctionnalités Log Analysis ou Log Management de Security Center, les journaux de détection de fichiers malveillants sont automatiquement stockés dans un Logstore dédié dans Security Center pour des requêtes approfondies et une analyse de traçabilité. Pour plus d'informations, consultez Distribution des journaux SAS et Journaux SIEM.

  • Traiter les résultats : Prend en charge les opérations sur les résultats de détection, notamment Add to Whitelist, Ignore, Denied Access et d'autres opérations. Pour les opérations spécifiques, consultez Gérer les résultats de détection de fichiers malveillants.

Configurer les notifications (facultatif)

Security Center propose des fonctionnalités de notification via robot DingTalk qui peuvent pousser automatiquement les alertes de fichiers malveillants détectés vers des groupes DingTalk pour une réponse rapide aux risques de détection. La procédure est la suivante :

  1. Accédez à la console Security Center - Paramètres système - Notifications. Dans le coin supérieur gauche de la page, sélectionnez la région de vos ressources : Chinese Mainland ou Outside Chinese Mainland.

  2. Dans l'onglet DingTalk Chatbot, cliquez sur Add Chatbot.

Quotas et limites

  • Limites de taille de fichier :

    • Taille totale des fichiers par tâche : Aucune limite.

    • Limite de taille par fichier :

      • Détection de fichiers hors ligne via SDK : la taille d'un fichier unique ne doit pas dépasser 100 Mo.

      • Détection de fichiers OSS via la console : la taille d'un fichier unique ne doit pas dépasser 1 Go.

    • Description des dépassements de limite :

      • Lorsque la taille du fichier dépasse la limite ou que les fichiers décompressés dépassent la limite de quantité ou de taille, les fichiers concernés ne seront pas détectés. Les fichiers non détectés ne sont pas comptabilisés dans le nombre de facturation.

      • Lorsque les demandes de détection de fichiers malveillants dépassent la capacité de la file d'attente, vous devez attendre ou optimiser la capacité de traitement simultané.

  • Limites de détection des fichiers compressés : Jusqu'à 5 niveaux de décompression, 1 000 fichiers et 1 Go de taille totale.

  • Restrictions environnementales : Les environnements Financial Cloud et Government Cloud ne sont pas pris en charge.

  • Taux de requête API par défaut (QPS) : Essai : 10 requêtes/seconde. Payant : 20 requêtes/seconde.

    Remarque
    • La vitesse de détection est affectée par les conditions réseau, les performances du serveur, les spécifications des produits cloud et d'autres facteurs.

    • Le SDK utilise un mécanisme de file d'attente asynchrone pour gérer les pics de demande et améliorer la simultanéité. Lorsque la file d'attente interne est pleine, les nouvelles demandes sont mises en pause jusqu'à ce que la file d'attente ait de l'espace disponible.

Facturation

La détection de fichiers malveillants (y compris la détection de fichiers malveillants Agentic) est facturée en fonction du nombre de fichiers détectés (nombre de détections de fichiers). Utilisez l'Abonnement pour activer la Détection de fichiers malveillants, ou le Paiement à l'utilisation pour activer la Détection de fichiers malveillants Agentic.

  • Tarification :

    • Abonnement (Détection de fichiers malveillants) : 1,5 USD pour 10 000 détections par mois. L'abonnement prend uniquement en charge la fonctionnalité de détection de fichiers malveillants. La détection par modèle IA, la détection de fichiers Skill et la détection de fichiers NAS ne sont pas prises en charge.

    • Paiement à l'utilisation (Détection de fichiers malveillants Agentic) : 0,0012 USD par fichier. Le paiement à l'utilisation prend en charge l'ensemble des capacités de détection de fichiers malveillants Agentic. En plus de la fonctionnalité de détection de fichiers malveillants, il prend également en charge la détection par modèle IA, la détection de fichiers Skill et la détection de fichiers NAS.

      Remarque

      Après avoir activé le service de paiement à l'utilisation, le système facture des frais de service de base supplémentaires (0,0072 USD par heure).

  • Facturation des fichiers compressés : Si la détection de fichiers compressés est activée, les comptes de détection consommés sont calculés en fonction du nombre de fichiers décompressés.

    Exemple : La détection d'un package compressé contenant 1 000 petits fichiers compte comme 1 000 fichiers et consomme 1 000 comptes de détection.

  • Traiter les résultats de détection : Inclus dans les frais de service de la fonctionnalité. Aucun frais supplémentaire.

Remarque

Pour plus d'informations sur les modèles de facturation et la logique de facturation, consultez Abonnement et Paiement à l'utilisation.

Dépannage

  • La liste des buckets est vide ou le bucket cible est introuvable

    • Cause : La région du bucket ne fait pas partie des régions prises en charge pour la détection de fichiers malveillants.

      Solution : Vérifiez si la région du bucket figure dans la liste des Régions prises en charge. Si ce n'est pas le cas, copiez les fichiers vers un bucket situé dans une région prise en charge.

    • Cause : La liste des buckets n'a pas été synchronisée.

      Solution : Dans l'onglet OSS File Check, cliquez sur Synchronize Buckets pour synchroniser la dernière liste des buckets.

  • Autorisations insuffisantes ou échec d'autorisation

    • Cause : Le rôle lié au service Security Center n'a pas été créé ou la stratégie d'autorisations est incomplète.

    • Solution : Assurez-vous que le compte Alibaba Cloud actuel dispose des autorisations de gestion RAM. Lors de la première activation de la détection de fichiers malveillants, le système crée automatiquement le rôle lié au service AliyunServiceRoleForSasFileDetect. Pour le créer manuellement, reportez-vous à la rubrique Créer un utilisateur RAM.

  • Impossible de lancer la tâche de détection ou quota insuffisant

    • Cause : Le pack de ressources Subscription a expiré ou le solde du compte Pay-as-you-go est insuffisant.

      Solution : Accédez à la page Overview de Security Center pour consulter le nombre de détections disponibles. Si le quota est insuffisant, rendez-vous sur la page d'achat de Security Center pour renouveler votre abonnement ou recharger votre compte.

    • Cause : La file d'attente de détection est pleine, dépassant la limite de QPS (requêtes par seconde).

      Solution : Le QPS par défaut est de 10 requêtes/seconde pour la version d'essai et de 20 requêtes/seconde pour la version payante. Réduisez la fréquence de concurrence ou réessayez ultérieurement.

  • Les fichiers chiffrés ne peuvent pas être détectés

    • Cause : Le fichier OSS utilise une méthode de chiffrement non prise en charge ou la méthode de déchiffrement est incorrectement sélectionnée.

    • Solution : La détection de fichiers malveillants prend uniquement en charge le chiffrement côté serveur OSS (SSE-KMS, SSE-OSS). Sélectionnez le File Decryption Type correspondant à la méthode de chiffrement du fichier. Le chiffrement côté client ou les fichiers chiffrés par des tiers ne sont pas pris en charge.

FAQ

Facturation et quota

  • Les comptes de détection de fichiers utilisés peuvent-ils être remboursés ?

    Non. Avant la détection, vérifiez la portée des fichiers et la politique de détection afin d'éviter de gaspiller des comptes de détection en raison d'une erreur de manipulation.

  • Pourquoi les valeurs « Total Files » et « Detected Total Files » sont-elles incohérentes dans l'onglet de détection de fichiers OSS ?

    • Total Files : Nombre naturel de fichiers dans le bucket (un package compressé compte pour 1).

    • Detected Total Files : Nombre réel de fichiers analysés. Si l'analyse des fichiers compressés est activée, les fichiers internes sont également comptabilisés. Le nombre total dépend des paramètres Decompression Level et maximum decompressed file count. Cette valeur représente le total cumulatif de toutes les tâches de détection historiques sous le bucket actuel, et non le compte d'une seule détection. Même si des fichiers ont été supprimés, leurs historiques de détection restent comptabilisés dans le total cumulatif ; ainsi, le total détecté peut être supérieur au nombre actuel de fichiers dans le bucket.

    Lorsqu'un package compressé contenant un grand nombre de fichiers est analysé, la valeur « Detected Total Files » sera bien supérieure à « Total Files ». La facturation est basée sur le nombre réel de fichiers détectés.

  • Que faire si la tâche de détection est interrompue en raison d'un quota insuffisant ?

    Si vous utilisez le modèle Subscription, la tâche d'analyse sera interrompue lorsque le nombre restant de détections sera insuffisant. Appliquez l'une des solutions suivantes :

    • Annuler la tâche d'analyse en cours : Sur la page OSS File Check, localisez le bucket en cours d'analyse et cliquez sur le bouton Cancel Detection dans la ligne correspondante pour annuler la tâche.

    • Mettre à niveau la configuration : Accédez à la page . Dans la section Subscription, cliquez sur Change Configuration>Upgrade Now pour acheter un nombre suffisant de détections de fichiers malveillants. Pour plus d'informations, consultez la rubrique Mettre à niveau ou rétrograder.

    • Modifier la politique de détection : Désactivez l'option compressed file decompression dans les paramètres de détection pour réduire le nombre de comptes consommés par tâche, puis relancez l'analyse.

      Si vous n'annulez pas la tâche en cours et que vous vous contentez de renouveler l'abonnement pour poursuivre l'analyse, le système continuera à décompresser et analyser les fichiers du package compressé, ce qui consommera toujours votre quota.

Gestion des autorisations

  • Comment consulter les détails d'autorisation du SDK de détection de fichiers malveillants (tel que le nombre restant et la date d'expiration) ?

    Vous pouvez consulter les informations relatives à l'Personal SDK Authorization du compte actuel dans la console, y compris la version, le statut d'activation, les limites d'autorisation, le nombre restant, les limites de débit et la date d'expiration.

    1. Accédez à la . Dans le coin supérieur gauche de la page, sélectionnez la région de vos ressources : Chinese Mainland ou Outside Chinese Mainland.

    2. Cliquez sur SDK and Permissions dans le coin supérieur droit.

  • Que faire si je reçois le message « Malicious file detection SDK purchased but not yet used » ou « Notification not configured » ?

    • Purchased but not yet used : Cela signifie que le quota de détection a été acheté, mais qu'aucune tâche de détection n'a été exécutée. Reportez-vous à la section « Configurer et exécuter des tâches de détection » de cette rubrique pour effectuer une détection manuelle via la console ou intégrer le SDK pour lancer la détection.

    • Notification not configured : Cela signifie que les notifications de résultats de détection n'ont pas été configurées, ce qui n'affecte pas la fonctionnalité de détection elle-même. Pour recevoir des notifications lors de la détection de fichiers malveillants, reportez-vous à la section « Configurer les notifications (facultatif) » de cette rubrique pour finaliser la configuration. Une fois configuré, le message disparaîtra.

Annexe

Référence API

Vous pouvez utiliser la fonctionnalité de détection de fichiers malveillants en appelant des opérations API. Voici quelques documents de référence :

Types de virus pris en charge

Type de virus (virus_type)

Nom du virus

Backdoor

Backdoor shell inversé

DDoS

Cheval de Troie DDoS

Downloader

Cheval de Troie downloader

Engtest

Programme de test du moteur

Hacktool

Outil de piratage

Trojan

Programme à haut risque

Malbaseware

Logiciel de base contaminé

MalScript

Script malveillant

Malware

Logiciel malveillant

Miner

Programme de minage

Proxytool

Outil proxy

RansomWare

Ransomware

RiskWare

Logiciel à risque

Rootkit

Rootkit

Stealer

Voleur de données

Scanner

Scanner

Suspicious

Programme suspect

Virus

Virus infectieux

WebShell

Web shell

Worm

Ver informatique

AdWare

Logiciel publicitaire

Patcher

Patcher

Gametool

Outil de jeu