Presentation is loading. Please wait.

Presentation is loading. Please wait.

Banned APIs and Sin Within! Michael Howard

Similar presentations

Presentation on theme: "Banned APIs and Sin Within! Michael Howard"— Presentation transcript:

1 Banned APIs and Sin Within! Michael Howard

2 Who Is This Guy? Christian (imperfect in every possible way!) Microsoft employee for 20 years Always in security Worked on the Microsoft SDL since inception

3 Goals and Non-Goals I am not one for drawing analogies – Security Analogies are usually Wrong e/2006/03/09/ aspx e/2006/03/09/ aspx I use quotes from the Bible to compare/contrast software security The Bible is correct, your code is not. :-)

4 If cars operated in an environment like the Internet, they would… Be driven by people with little regard for safe automobile operation. Have their windshields shot out every 60 secs. Once you have bullet-proof glass, the bad guys place nails at freeway off-ramps next to signs like, free coffee this way – and someone is always trying to steal your keys – and pull out your sparkplugs – and siphon your gas Talking of gas, you fill up at a Shell station, only to realize the gas really isnt gas, its vegetable oil and sand Oh, that gas station isnt a Shell station, it certainly looked like one, but they took your credit card details anyway As this all goes on, you cant see the adversary And the adversaries are sharing new weapons with each other

5 The SDL A set of process changes that help improve software security Over 100 requirements and recommendations About 30 deal with memory corruption Removing banned APIs is one such requirement

6 What Are The Banned APIs? Mostly memory corruption APIs – strcpy … – strcat … – strncpy … – strncat … – sprintf … – gets …

7 Banned APIs strcpy, strcpyA, strcpyW, wcscpy, _tcscpy, _mbscpy, StrCpy, StrCpyA, StrCpyW, lstrcpy, lstrcpyA, lstrcpyW, _tccpy, _mbccpy strcat, strcatA, strcatW, wcscat, _tcscat, _mbscat, StrCat, StrCatA, StrCatW, lstrcat, lstrcatA, lstrcatW, StrCatBuff, StrCatBuffA, StrCatBuffW, StrCatChainW, _tccat, _mbccat strncpy, wcsncpy, _tcsncpy, _mbsncpy, _mbsnbcpy, StrCpyN, StrCpyNA, StrCpyNW, StrNCpy, strcpynA, StrNCpyA, StrNCpyW, lstrcpyn, lstrcpynA, lstrcpynW strncat, wcsncat, _tcsncat, _mbsncat, _mbsnbcat, StrCatN, StrCatNA, StrCatNW, StrNCat, StrNCatA, StrNCatW, lstrncat, lstrcatnA, lstrcatnW, lstrcatn CharToOem, CharToOemA, CharToOemW, OemToChar, OemToCharA, OemToCharW, CharToOemBuffA, CharToOemBuffW wnsprintf, wnsprintfA, wnsprintfW, sprintfW, sprintfA, wsprintf, wsprintfW, wsprintfA, sprintf, swprintf, _stprintf, _snwprintf, _snprintf, _sntprintf, wvsprintf, wvsprintfA, wvsprintfW, vsprintf, _vstprintf, vswprintf, _vsnprintf, _vsnwprintf, _vsntprintf, wvnsprintf, wvnsprintfA, wvnsprintfW strtok, _tcstok, wcstok, _mbstok makepath, _tmakepath, _makepath, _wmakepath, _splitpath, _tsplitpath, _wsplitpath scanf, wscanf, _tscanf, sscanf, swscanf, _stscanf, snscanf, snwscanf, _sntscanf _itoa, _itow, _i64toa, _i64tow, _ui64toa, _ui64tot, _ui64tow, _ultoa, _ultot, _ultow gets, _getts, _gettws IsBadWritePtr, IsBadHugeWritePtr, IsBadReadPtr, IsBadHugeReadPtr, IsBadCodePtr, IsBadStringPtr memcpy

8 CONFIGRET ResDesToNtResource( IN PCVOID ResourceData, IN RESOURCEID ResourceType, IN ULONG ResourceLen, IN PCM_PARTIAL_RESOURCE_DESCRIPTOR pResDes, IN ULONG ulTag ) { case ResType_ClassSpecific: { PCS_RESOURCE pCsData = (PCS_RESOURCE)ResourceData; LPBYTE ptr = NULL; ptr = (LPBYTE)((LPBYTE)pResDes + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); memcpy(ptr, pCsData->CS_Header.CSD_Signature + pCsData->CS_Header.CSD_LegacyDataOffset, pCsData->CS_Header.CSD_LegacyDataSize); PnP MS Zotob

9 #define SSL2_MAX_CHALLENGE_LEN 32 typedef struct _Ssl2_Client_Hello { DWORD dwVer; DWORD cCipherSpecs; DWORD cbSessionID; DWORD cbChallenge; UCHAR SessionID[SSL3_SESSION_ID_LEN]; UCHAR Challenge[SSL2_MAX_CHALLENGE_LEN]; Ssl2_Cipher_Kind CipherSpecs[MAX_UNI_CIPHERS]; } Ssl2_Client_Hello, * PSsl2_Client_Hello; SP_STATUS Pct1SrvHandleUniHello(..., PSsl2_Client_Hello pHello,...) { Pct1_Client_Hello ClientHello;... CopyMemory( ClientHello.Challenge, pHello->Challenge, pHello->cbChallenge); PCT SChannel MS04-011

10 NNTP MS Last Updated HRESULT CNewsStore::OnResponse(LPNNTPRESPONSE pResponse) {... if (pResponse->state == NS_LIST) hr = _HandleListResponse(pResponse, FALSE)... } HRESULT CNewsStore::_HandleListResponse(LPNNTPRESPONSE pResp, BOOL fNew) { LPSTR psz, pszCount; int nSize; char szGroupName[CCHMAX_FOLDER_NAME]; LPNNTPLIST pnl = &pResp->rList; for (DWORD i = 0; i cLines; i++, m_op.dwProgress++) { psz = pnl->rgszLines[i]; while (*psz && !IsSpace(psz)) psz = CharNext(psz); nSize = (int)(psz - pnl->rgszLines[i]); if (nSize >= CCHMAX_FOLDER_NAME) nSize = CCHMAX_FOLDER_NAME - 1; CopyMemory(szGroupName, pnl->rgszLines[i], nSize);

11 LSASS MS VOID DsRolepDebugDumpRoutine( IN DWORD DebugFlag, IN LPWSTR Format, va_list arglist ) { #define DsRolepDebugDumpRoutine_BUFFERSIZE 1024 WCHAR OutputBuffer[DsRolepDebugDumpRoutine_BUFFERSIZE];... length += (ULONG) wvsprintfW(&OutputBuffer[length], Format, arglist);... } Sasser

12 How Do you Find Them? #include C4996 warnings

13 The Replacements Dont use C++ as a glorified C! Use std::string Use strsafe.h Use strcpy_s etc

14 Auto-replacement of Banned Functions If the compiler knows the destination buffer size at compile time, it can automatically generate secure code Add the following to auto-migrate functions to safe functions #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES (1) char buf[32]; strcpy(buf,src); char buf[32]; strcpy_s(buf,src,32);

15 But Isnt C dead?

16 The Leap of Faith What about regressions? In ten years, I have seen only one regression at Microsoft

17 Effectiveness? Over 25% of MSRC memory corruption vulns did not affect newer products simply because we banned the API(s) in question and replaced them with a more secure version Thats low cost engineering at its best!

18 Pop Quiz Whats in an 8oz glass of wine? Whats in an 8oz glass of poison? Whats in an 8oz glass of wine with a drop of poison?

19 Sin and Insecure Code Righteous Man + One Sin Sinful Man Well-Written Code + One Vulnerability Insecure System

20 All Sin is the Same … There is no good or bad sin, its all sin in Gods eyes. There is no Security Bulletin scale for sin Critical: Adultery, Murder Important:Bearing False Witness Moderate: Stealing Low: Coveting

21 … but insecure Code is not the Same An anonymously accessible remote code execution vulnerability that gives you root is *way* worse than a local information disclosure vuln accessibly only by admins Critical: Remote code execution Important:Server DoS Moderate: Temporary Server DoS Low: Client DoS

22 Banned APIs We have banned over 120 APIs at Microsoft They are great examples of One-line Sins

23 Removing Sin How do you remove Sin? By replacing Sin with something not Sinful! Easy to say, very hard to do. And I know that nothing good lives in me, that is, in my sinful nature. I want to do what is right, but I can't. Romans 7:18 How do you remove banned APIs? By replacing them with something less dangerous! Easy to say, easy to do.

24 Removal takes a Leap of Faith Trust that God forgives your Sins Trust that the banned API replacements dont introduce regressions! Praise the Lord, … who forgives all your sins. Psalm 103:3

25 How Do you Remove Banned APIs? Admit you have banned APIs (admit you sin!) Do something about it (admit the Lord into your heart) Dont repeat!

26 Banned APIs and the Sin Within Summary Admit you sin – In life and in code Do something about it – Study Romans – Remove Banned APIs Put steps in place to help prevent Sin and banned APIs – Think!! – Use banned.h in all your C/C++ code

27 Questions!?

Download ppt "Banned APIs and Sin Within! Michael Howard"

Similar presentations

Ads by Google