• XSS.stack #1 – первый литературный журнал от юзеров форума

SMM Vulns

SMM Callout - это механизм, который позволяет вызывать функции из SMM в контексте операционной системы или обратно. Однако, если этот механизм не защищен должным образом, злоумышленник может использовать его для запуска вредоносного кода в привилегированном режиме, в том числе для перехвата управления системой или внедрения других вредоносных программ.

Таким образом, уязвимость SMM Callout может привести к серьезным последствиям для безопасности системы, поэтому важно обеспечить его защиту. Для этого можно использовать механизм проверки подписи, который позволит обнаружить любые изменения в вызываемой функции и предотвратить запуск вредоносного кода. Кроме того, необходимо ограничить доступ к SMM Callout, чтобы только авторизованные пользователи могли вызывать функции из SMM.
 
Выведи, пожалуйста, все возможные GUID, так или иначе связанные с SMM, а также PEI
Да, конечно. Вот список GUID, связанных с SMM и PEI:

1. GUID для SMM Communication - {7F8E2D99-9176-4B37-976C-8E40D5F8B14C}
2. GUID для SMM Communication MP - {9D2A7C61-418C-4D41-8D8A-3B3D3A3756FF}
3. GUID для PEI Core - {4F76E4A7-8E1F-4D42-AD5D-2F6FBEFCE1F5}
4. GUID для PEI Apriori - {F2A13D35-65E9-4F6E-8EAE-FA2A3E847E62}
5. GUID для PEI Boot Device Selection - {3EBC6138-4A4B-4B47-8EFE-29B2B8B4D7D6}
6. GUID для PEI Block IO - {8C8CE578-8A3D-4F1C-9935-896185C32DD3}
7. GUID для PEI Serial IO - {BB25EAD6-CCC2-4C76-8DDF-13F697B562E8}
8. GUID для PEI Debug Support - {2755590C-6F3C-42FA-9EA3-1AACEB9C8B01}
9. GUID для PEI Reset - {E2078E22-6FC2-4D75-9E20-E5E24FAEB6D7}
10. GUID для PEI Security - {C7F6D4B6-4B6B-4b4e-AECC-EB4C8FFB5E2F}

Эти GUID используются в различных реализациях SMM и PEI для обеспечения связи и взаимодействия между компонентами и устройствами, а также для обнаружения и устранения ошибок.
 
Является ли данный декомпилированный код уязвимым к TOCTOU?

C:
smm_field_18 = CommBuffer->field_18;
if(v7 > dword_3120 - v6)
    v7 = dword3120 - v6;

CommBuffer->field_10 = v7;
if(SmmIsBufferOutsideSmmValid(smm_field_18, v7)) {
    if(v9 && (CommBuffer->field_18 != v6 + qword_3128))
        CopyMem(CommBuffer->field_18, (v6 + qword_3128), v9);
} else {
    Status = EFI_ACCESS_DENIED;
}
Данный код является потенциально уязвимым к атакам типа TOCTOU (Time of Check to Time of Use).

TOCTOU-атака может произойти, если злоумышленник изменяет содержимое памяти между вызовами функций SmmIsBufferOutsideSmmValid и CopyMem, что может привести к нарушению безопасности системы.

Для того, чтобы защитить код от атак TOCTOU, необходимо использовать механизмы синхронизации, такие как блокировки или семафоры, чтобы обеспечить атомарный доступ к ресурсам памяти и предотвратить изменение их содержимого во время выполнения программы.

Также можно использовать механизмы проверки целостности данных, например, хэш-функции, чтобы обнаружить любые изменения в содержимом памяти и принять соответствующие меры для предотвращения атак TOCTOU.
 
ChatGPT, насколько я знаю, SMM Callout не будет считаться валидным, если происходит переопределение EFI_RUNTIME_SERVICES на EFI_SMM_RUNTIME_SERVICES_TABLE. Но, если уязвимость вида SMM Callout теоретически затрагивает EFI_BOOT_SERVICES, то является ли SMM Callout в модуле валидным?
Если происходит переопределение EFI_RUNTIME_SERVICES на EFI_SMM_RUNTIME_SERVICES_TABLE, то SMM Callout не будет считаться валидным, потому что он не будет иметь доступа к EFI_BOOT_SERVICES.

Однако, если уязвимость вида SMM Callout затрагивает EFI_BOOT_SERVICES, то это может потенциально сделать SMM Callout в модуле валидным, даже если EFI_RUNTIME_SERVICES переопределен. В этом случае, необходимо использовать дополнительные механизмы защиты, чтобы предотвратить атаки на SMM Callout.

Для защиты от уязвимостей вида SMM Callout, необходимо использовать механизмы проверки подписи, которые позволят обнаружить любые изменения в вызываемой функции и предотвратить запуск вредоносного кода. Кроме того, необходимо ограничить доступ к SMM Callout, чтобы только авторизованные пользователи могли вызывать функции из SMM. Это поможет предотвратить возможные атаки на SMM Callout и обеспечить безопасность системы.
 
Хорошо, спасибо!
Является ли данный декомпилированный код потенциально узвимым к утечке информации?
C:
result = sub_D03F40(v23, &v24);
  if ( result < 0 )
    goto LABEL_26;
  DataSize = 84i64;
  result = gRT_231->GetVariable(&off_D08D08, &VendorGuid, &Attributes, &DataSize, Data);
  if ( result < 0 )
    goto LABEL_26;
  Size = 7i64;
  result = gRT_231->GetVariable(&off_D08D38, &VendorGuid, &Attribs, &Size, Data2);
  if ( result < 0 )
    goto LABEL_26;
  if ( !v25 )
  {
    if ( v24 )
    {
      if ( v24 != 1 )
      {
        if ( v24 != 2 )
          goto LABEL_21;
LABEL_24:
        Data[16] = v5;
        Data[15] = v4;
        Data[14] = v7;
        Data[13] = v6;
        Data[12] = v12;
        Data[11] = v11;
        goto LABEL_25;
      }
    }
    else if ( Data2[0] != 1 )
    {
      goto LABEL_24;
    }
    Data[20] = v11;
    Data[21] = v12;
    Data[22] = v6;
    Data[23] = v7;
    Data[24] = v4;
    Data[25] = v5;
    goto LABEL_25;
  }
  if ( v25 != 1 )
  {
LABEL_21:
    *(a1 + 128) = 3;
    return result;
  }
  if ( !v24 )
  {
    if ( Data2[1] != 1 )
      goto LABEL_15;
LABEL_17:
    Data[48] = v11;
    Data[49] = v12;
    Data[50] = v6;
    Data[51] = v7;
    Data[52] = v4;
    Data[53] = v5;
    goto LABEL_25;
  }
  if ( v24 == 1 )
    goto LABEL_17;
  if ( v24 != 2 )
    goto LABEL_21;
LABEL_15:
  Data[39] = v11;
  Data[40] = v12;
  Data[41] = v6;
  Data[42] = v7;
  Data[43] = v4;
  Data[44] = v5;
LABEL_25:
  DataSize = 84i64;
  result = gRT_231->SetVariable(&off_D08D08, &VendorGuid, Attributes, 0x54ui64, Data);
LABEL_26:
  *(a1 + 128) = result;
  return result;
Извините, мне не удалось связаться с аналитическим центром ChatGPT :(
 
Хорошо, давай попробуем еще раз. Является ли данный декомпилированный листинг потенциально уязвимым к утечке информации?

C:
result = sub_D03F40(v23, &v24);
  if ( result < 0 )
    goto LABEL_26;
  DataSize = 84i64;
  result = gRT_231->GetVariable(&off_D08D08, &VendorGuid, &Attributes, &DataSize, Data);
  if ( result < 0 )
    goto LABEL_26;
  Size = 7i64;
  result = gRT_231->GetVariable(&off_D08D38, &VendorGuid, &Attribs, &Size, Data2);
  if ( result < 0 )
    goto LABEL_26;
  if ( !v25 )
  {
    if ( v24 )
    {
      if ( v24 != 1 )
      {
        if ( v24 != 2 )
          goto LABEL_21;
LABEL_24:
        Data[16] = v5;
        Data[15] = v4;
        Data[14] = v7;
        Data[13] = v6;
        Data[12] = v12;
        Data[11] = v11;
        goto LABEL_25;
      }
    }
    else if ( Data2[0] != 1 )
    {
      goto LABEL_24;
    }
   // ...
LABEL_25:
  DataSize = 84i64;
  result = gRT_231->SetVariable(&off_D08D08, &VendorGuid, Attributes, 0x54ui64, Data); // Info Disclosure?
LABEL_26:
  *(a1 + 128) = result;
  return result;
Извините, мне не удалось связаться с аналитическим центром ChatGPT :(
 
ChatGPT, проанализируй код и скажи, какая возможная уязвимость находится здесь:

C:
result = sub_D03F40(v23, &v24);
  if ( result < 0 )
    goto LABEL_26;
  DataSize = 84i64;
  result = gRT_231->GetVariable(&off_D08D08, &VendorGuid, &Attributes, &DataSize, Data);
  if ( result < 0 )
    goto LABEL_26;
  Size = 7i64;
  result = gRT_231->GetVariable(&off_D08D38, &VendorGuid, &Attribs, &Size, Data2);
  if ( result < 0 )
    goto LABEL_26;
  if ( !v25 )
  {
    if ( v24 )
    {
      if ( v24 != 1 )
      {
        if ( v24 != 2 )
          goto LABEL_21;
LABEL_24:
        Data[16] = v5;
        Data[15] = v4;
        Data[14] = v7;
        Data[13] = v6;
        Data[12] = v12;
        Data[11] = v11;
        goto LABEL_25;
      }
    }
    else if ( Data2[0] != 1 )
    {
      goto LABEL_24;
    }
   // ...
LABEL_25:
  DataSize = 84i64;
  result = gRT_231->SetVariable(&off_D08D08, &VendorGuid, Attributes, 0x54ui64, Data); // Info Disclosure?
LABEL_26:
  *(a1 + 128) = result;
  return result;
Извините, мне не удалось связаться с аналитическим центром ChatGPT :(
 
Покажи как выглядит EFI_SMM_RUNTIME_SERVICES_TABLE_GUID
Константа EFI_SMM_RUNTIME_SERVICES_TABLE_GUID определяется в файле efiguids_ami.py следующим образом:

```
EFI_SMM_RUNTIME_SERVICES_TABLE_GUID = EFI_GUID(0x395f2a5e, 0x6569, 0x4d04, 0x87, 0x35, 0x6f, 0x74, 0x46, 0x32, 0x4a, 0x4d)
```

GUID представляет собой уникальный идентификатор, который используется для идентификации тех или иных компонентов в системе. В данном случае, EFI_SMM_RUNTIME_SERVICES_TABLE_GUID является GUID для таблицы функций управления режимом системного управления (SMM) в системах на базе UEFI.
 
Покажи мне пройстейший пример атаки типа Information Disclosure через функцию SetVariable из EFI_RUNTIME_SERVICES
Конечно, вот пример атаки на информационное раскрытие через функцию SetVariable в EFI_RUNTIME_SERVICES:

```
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>

EFI_STATUS EFIAPI UefiMain(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_GUID VariableGuid = {0x12345678, 0x1234, 0x1234, {0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34}};
UINTN DataSize = 4;
UINT8 Data[4] = {0x01, 0x02, 0x03, 0x04};
EFI_STATUS Status;

Status = gRT->SetVariable(
L"TestVariable",
&VariableGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS,
DataSize,
Data
);

if (EFI_ERROR(Status)) {
Print(L"Error setting variable: %r\n", Status);
return Status;
}

return EFI_SUCCESS;
}
```

Этот пример кода устанавливает переменную с именем "TestVariable" и значением {0x01, 0x02, 0x03, 0x04} с помощью функции SetVariable. Однако, установка этой переменной выполняется с атрибутом EFI_VARIABLE_BOOTSERVICE_ACCESS, что означает, что переменная может быть доступна для чтения и записи как во время загрузки, так и во время выполнения операционной системы.

Если злоумышленник получит физический доступ к компьютеру, он может использовать утилиту для чтения переменных UEFI и извлечь значение переменной "TestVariable", которое было записано в примере кода выше. Это может привести к утечке конфиденциальной информации, такой как пароли, ключи безопасности и другие секретные данные.
 
Покажи такой же пример, но с функциями GetVariable и SetVariable
Конечно, вот пример атаки на информационное раскрытие через функции GetVariable и SetVariable в EFI_RUNTIME_SERVICES:

```
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>

EFI_STATUS EFIAPI UefiMain(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_GUID VariableGuid = {0x12345678, 0x1234, 0x1234, {0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34}};
UINTN DataSize = 4;
UINT8 Data[4] = {0x01, 0x02, 0x03, 0x04};
EFI_STATUS Status;

Status = gRT->SetVariable(
L"TestVariable",
&VariableGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS,
DataSize,
Data
);

if (EFI_ERROR(Status)) {
Print(L"Error setting variable: %r\n", Status);
return Status;
}

// Чтение переменной TestVariable
UINTN ReadDataSize = 0;
UINT8 ReadData[4];
Status = gRT->GetVariable(
L"TestVariable",
&VariableGuid,
NULL,
&ReadDataSize,
ReadData
);

if (EFI_ERROR(Status)) {
Print(L"Error getting variable: %r\n", Status);
return Status;
}

// Вывод данных переменной TestVariable
for (UINTN i = 0; i < ReadDataSize; i++) {
Print(L"%02x ", ReadData);
}

return EFI_SUCCESS;
}
```

Этот пример кода устанавливает переменную с именем "TestVariable" и значением {0x01, 0x02, 0x03, 0x04} с помощью функции SetVariable. Затем он читает значение переменной "TestVariable" с помощью функции GetVariable и выводит его на экран.

Если злоумышленник получит физический доступ к компьютеру, он может использовать утилиту для чтения переменных UEFI и извлечь значение переменной "TestVariable", которое было записано в примере кода выше. Это может привести к утечке конфиденциальной информации, такой как пароли, ключи безопасности и другие секретные данные.
 
Выведи, пожалуйста, все функции, принадлежащие EFI_SMM_SYSTEM_TABLE2
Конечно, вот список функций, принадлежащих EFI_SMM_SYSTEM_TABLE2:

1. Register
2. Unregister
3. Communicae
4. LocateProtocol
5. LocateHandle
6. LocateDevicePath
7. InstallProtocolInterface
8. ReinstallProtocolInterface
9. UninstallProtocolInterface
10. HandleProtocol
11. PciCfg
12. Io
13. Mem
14. SmiManage
15. GetSmstLocation
16. Stall
17. SetVirtualAddressMap
18. ConvertPointer
19. GetNextHighMonotonicCount
20. ResetSystem
21. UpdateCapsule
22. QueryCapsuleCapabilities
23. QueryVariableInfo
 
Допустим, у нас есть какая-либо NVRAM переменная, которую нам нужно поменять из контекста ОС. Правильно ли я понимаю, что для того, чтоб поменять эту переменную, у самой переменной должен быть обязательным атрибут EFI_VARIABLE_RUNTIME_ACCESS? Или нужны какие-либо дополнительные атрибуты?
Да, вы правы. Чтобы изменить NVRAM переменную из контекста ОС, переменная должна иметь атрибут EFI_VARIABLE_RUNTIME_ACCESS. Этот атрибут указывает, что переменная может быть доступна для чтения и записи как во время загрузки, так и во время выполнения операционной системы.

Однако, помимо атрибута EFI_VARIABLE_RUNTIME_ACCESS, переменная также может иметь другие атрибуты, которые могут ограничить ее доступность. Например, переменная может иметь атрибут EFI_VARIABLE_NON_VOLATILE, который указывает, что переменная должна сохраняться на постоянной памяти и не должна быть удалена при перезагрузке системы.

Также, переменная может иметь атрибуты EFI_VARIABLE_BOOTSERVICE
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх