Condividi tramite


Avviso C6277

Nome applicazione NULL con un percorso senza virgoole nella chiamata a 'function-name': restituisce una vulnerabilità di sicurezza se il percorso contiene spazi

Questo avviso indica che il parametro del nome dell'applicazione è Null e che potrebbero essere presenti spazi nel nome del percorso eseguibile.

Osservazioni:

A meno che il nome 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 precedente nel percorso. Per correggere questo avviso, è possibile specificare il nome dell'applicazione anziché passare null. In alternativa, se si passa null per il nome dell'applicazione, usare le virgolette intorno al percorso eseguibile.

Nome dell'analisi del codice: CREATEPROCESS_ESCAPE

Esempio

Il codice di esempio seguente genera l'avviso C6277. L'avviso è causato dal nome dell'applicazione NULL e dal nome del percorso eseguibile con uno spazio. A causa del modo in cui la funzione analizza gli spazi, è possibile che venga eseguito un file eseguibile diverso. Per ulteriori informazioni, vedere 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 );
}

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