Condividi tramite


C6277

avviso C6277: Nome di applicazione NULL con un percorso senza virgolette nella chiamata a <funzione>: questa condizione può provocare una vulnerabilità di sicurezza se il percorso contiene spazi

L'avviso indica che il parametro del nome dell'applicazione è null e potrebbero essere presenti spazi nel nome del percorso dell'eseguibile. In questo caso, a meno che il nome dell'eseguibile non sia completo, è probabile che si verifichi un problema di sicurezza. Un utente malintenzionato potrebbe inserire un eseguibile non autorizzato con lo stesso nome in una posizione precedente del percorso. Per risolvere il problema, è possibile specificare il nome dell'applicazione invece di passare il valore null oppure, se viene passato null per il nome dell'applicazione, racchiudere il percorso dell'eseguibile tra virgolette.

Esempio

Nell'esempio di codice riportato di seguito l'avviso viene generato perché il parametro del nome dell'applicazione è null, e nel nome del percorso dell'eseguibile è presente uno spazio. Sussiste il rischio che possa essere eseguito un diverso eseguibile a causa del sistema utilizzato dalla funzione per analizzare gli spazi. Per ulteriori informazioni, vedere CreateProcess.

#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 );
}

Per risolvere il problema, racchiudere il percorso dell'eseguibile tra virgolette, come riportato nell'esempio seguente:

#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 );
}