Avertissement C6277

Nom de l’application NULL avec un chemin d’accès non cité dans l’appel à « nom-fonction » : entraîne une vulnérabilité de sécurité si le chemin contient des espaces

Cet avertissement indique que le paramètre nom de l’application a la valeur Null et qu’il peut y avoir des espaces dans le nom du chemin d’accès exécutable.

Notes

Sauf si le nom exécutable est complet, il est probable qu’il y ait un problème de sécurité. Un utilisateur malveillant peut insérer un exécutable non autorisé portant le même nom précédemment dans le chemin d’accès. Pour corriger cet avertissement, vous pouvez spécifier le nom de l’application au lieu de passer null. Sinon, si vous passez null pour le nom de l’application, utilisez des guillemets autour du chemin d’accès exécutable.

Nom de l’analyse du code : CREATEPROCESS_ESCAPE

Exemple

L’exemple de code suivant génère l’avertissement C6277. L’avertissement est dû au nom de l’application NULL et à partir du nom du chemin d’accès exécutable ayant un espace. En raison de la façon dont la fonction analyse les espaces, il existe un risque qu’un autre exécutable puisse être exécuté. Pour plus d’informations, consultez CreateProcessA.

#include <windows.h>
#include <stdio.h>

void f_defective()
{
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof( si ) );
    si.cb = sizeof( si );
    ZeroMemory( &pi, sizeof( pi ) );
    if( !CreateProcessA( NULL,
                        "C:\\Program Files\\MyApp",
                        NULL,
                        NULL,
                        FALSE,
                        0,
                        NULL,
                        NULL,
                        &si,
                        &pi ) )
    {
        puts( "CreateProcess failed." );
        return;
    }
    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

Pour corriger cet avertissement, utilisez des guillemets autour du chemin d’accès au fichier exécutable, comme illustré dans l’exemple suivant :

#include <windows.h>
#include <stdio.h>

void f ()
{
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof( si ) );
    si.cb = sizeof( si );
    ZeroMemory( &pi, sizeof( pi ) );

    if( !CreateProcessA( NULL,
                        "\"C:\\Program Files\\MyApp.exe\"",
                        NULL,
                        NULL,
                        FALSE,
                        0,
                        NULL,
                        NULL,
                        &si,
                        &pi ) )
    {
        puts( "CreateProcess failed." );
        return;
    }
    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}