Антивирусное программное обеспечение помечает код шифрования как вредоносное ПО

Мое приложение WPF .NET 4 имеет несколько недостатков с точки зрения идентификации вредоносных программ:

  • Он должен запускаться непосредственно с флэш-накопителя.
  • Он должен позволять пользователю устанавливать безопасность устройства, привязанную к главному компьютеру.
  • После того, как безопасность устройства установлена, на нем никогда не должно быть расшифрованных файлов.
  • Он должен расшифровывать файлы во временный каталог хост-компьютера.

Как оказалось, теперь существует «программа-вымогатель», которая шифрует файлы пользователя, а затем требует плату за ключ дешифрования.

В частности, Kapersky помечает процесс шифрования файлов как вредоносное ПО и очень эффективно убивает приложение. При шифровании «Лаборатория Касперского» идентифицирует вредоносное ПО, обозначенное как PDM:Win32.Generic, и приступает к обнаружению, прекращению и удалению. Сканирование уже зашифрованного устройства возвращается на 100 % без проблем.

Вот код шифрования/дешифрования файла. Он адаптирован из статьи о шифровании файлов CodeProject. Может ли быть что-то в этом коде, что вызывает подозрения в антивирусном программном обеспечении? Я использую только чистый .NET, никаких сторонних библиотек:

    /// <summary>
    /// Encrypt a file with a user-supplied password.
    /// WARNING: File will be lost if password is forgotton.
    /// </summary>
    /// <param name="inputFile">
    /// The name of the unencrypted file to encrypt.
    /// </param>
    /// <param name="encryptedFile">
    /// The name of the newly encrypted file to created.
    /// </param>
    /// <param name="clearTextPassword"></param>
    /// <param name="salt">
    /// You can bypass this and use the predefined salt in this class
    /// BUT IT IS NOT RECOMMENDED. Your code should provide an 8-byte
    /// array for the salt.
    /// </param>
    public static void EncryptFile( string inputFile, string encryptedFile,
        string clearTextPassword, byte[] salt = null )
    {
        salt = salt ?? FileSalt;
        byte[] key = new Rfc2898DeriveBytes( clearTextPassword, salt ).GetBytes( 16 );
        FileStream fsCrypt = new FileStream( encryptedFile, FileMode.Create );
        RijndaelManaged rmCrypto = new RijndaelManaged();
        rmCrypto.Padding = PaddingMode.PKCS7;
        CryptoStream cs = new CryptoStream( fsCrypt,
            rmCrypto.CreateEncryptor( key, key ),
            CryptoStreamMode.Write );
        FileStream fsIn = new FileStream( inputFile, FileMode.Open );
        int data;
        while( ( data = fsIn.ReadByte() ) != -1 )
            cs.WriteByte( (byte)data );
        fsIn.Close();
        cs.Close();
        fsCrypt.Close();
    }

    /// <summary>
    /// Decrypt a file with a user-supplied password.
    /// </summary>
    /// <param name="inputFile">
    /// The name of the encrypted file to decrypt.
    /// </param>
    /// <param name="unencryptedFile">
    /// The name of the unencrypted file to create.
    /// </param>
    /// <param name="clearTextPassword"></param>
    /// <param name="salt">
    /// You can bypass this and use the predefined salt in this class
    /// BUT IT IS NOT RECOMMENDED. Your code should provide an 8-byte
    /// array for the salt.
    /// </param>
    public static void DecryptFile( string inputFile, string unencryptedFile,
        string clearTextPassword, byte[] salt = null )
    {
        salt = salt ?? FileSalt;
        byte[] key = new Rfc2898DeriveBytes( clearTextPassword, salt ).GetBytes( 16 );
        FileStream fsCrypt = new FileStream( inputFile, FileMode.Open );
        RijndaelManaged rmCrypto = new RijndaelManaged();
        rmCrypto.Padding = PaddingMode.PKCS7;
        CryptoStream cs = new CryptoStream( fsCrypt,
            rmCrypto.CreateDecryptor( key, key ),
            CryptoStreamMode.Read );
        FileStream fsOut = new FileStream( unencryptedFile, FileMode.Create );
        int data;
        while( ( data = cs.ReadByte() ) != -1 )
            fsOut.WriteByte( (byte)data );
        fsOut.Close();
        cs.Close();
        fsCrypt.Close();
    }

Обратите внимание, что меня не очень интересуют комментарии о моем использовании строки вместо SecureString для открытого пароля и т. д., если только эта информация не поможет решить проблему AV.


person Bruce Pierson    schedule 16.02.2015    source источник
comment
Оо... Проблема в данном случае в Каперском, а не в RijndaelManaged...   -  person rducom    schedule 16.02.2015
comment
Вы должны направить этот вопрос (и собственно исполняемый файл) в службу поддержки Касперского.   -  person Oleg Estekhin    schedule 16.02.2015
comment
И как безопасно расшифровывать файлы во временный каталог хост-компьютера? Базовое восстановление или чтение необработанного диска выявило бы их.   -  person Xen2050    schedule 17.02.2015
comment
@ Xen2050 - на главном компьютере нет необходимости в шифровании. Устройство подключается к компьютеру только тогда, когда пользователь вводит правильный контрольный вопрос и ответ. Проблема заключается в потере устройства и расшифровке файлов на нем. Опять же, меня не очень интересуют комментарии о моем дизайне, за исключением того, что касается того, как преодолеть препятствие AV.   -  person Bruce Pierson    schedule 17.02.2015
comment
Просто комментарий, не все они могут быть интересными, смотрели на разногласия с безопасностью, но звучит нормально, учитывая ситуацию.   -  person Xen2050    schedule 17.02.2015
comment
Это нормально, нет проблем. В каком-то смысле, чем больше информации добавляется, тем больше вероятность того, что что-то всплывет кому-то, поэтому каждый комментарий помогает. :)   -  person Bruce Pierson    schedule 17.02.2015


Ответы (1)


«Лаборатория Касперского» пришла к выводу, что это было ложное срабатывание, и они корректируют свое программное обеспечение, чтобы справиться с этим.

person Bruce Pierson    schedule 08.03.2015
comment
Вы можете отправить свое приложение на virustotal.com, чтобы проверить, дают ли какие-либо другие поставщики ложное срабатывание. - person Scott Chamberlain; 08.03.2015