Skip to content

Commit 18f4e12

Browse files
committed
fix misaligned access when reading PKCS#11 attributes
CK_ATTRIBUTE.pValue pointers are not guaranteed to be naturally aligned. Direct casts (`*(CK_KEY_TYPE*)pValue`, `*(CK_BBOOL*)pValue`, etc.) trigger undefined behavior. Security impact: partials read from adjacent memory or DoS Fixed by using `memcpy()` in all attribute parsing paths (extractObjectInformation, C_CopyObject, C_FindObjectsInit). Signed-off-by: Shawn C <citypw@hardenedlinux.org>
1 parent 6319797 commit 18f4e12

1 file changed

Lines changed: 23 additions & 14 deletions

File tree

‎src/lib/SoftHSM.cpp‎

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -247,29 +247,33 @@ static CK_RV extractObjectInformation(CK_ATTRIBUTE_PTR pTemplate,
247247
}
248248
break;
249249
case CKA_KEY_TYPE:
250-
if (pTemplate[i].ulValueLen == sizeof(CK_KEY_TYPE))
250+
if (pTemplate[i].ulValueLen == sizeof(CK_KEY_TYPE) &&
251+
pTemplate[i].pValue != NULL_PTR)
251252
{
252-
keyType = *(CK_KEY_TYPE*)pTemplate[i].pValue;
253+
memcpy(&keyType, pTemplate[i].pValue, sizeof(keyType));
253254
bHasKeyType = true;
254255
}
255256
break;
256257
case CKA_CERTIFICATE_TYPE:
257-
if (pTemplate[i].ulValueLen == sizeof(CK_CERTIFICATE_TYPE))
258+
if (pTemplate[i].ulValueLen == sizeof(CK_CERTIFICATE_TYPE) &&
259+
pTemplate[i].pValue != NULL_PTR)
258260
{
259-
certType = *(CK_CERTIFICATE_TYPE*)pTemplate[i].pValue;
261+
memcpy(&certType, pTemplate[i].pValue, sizeof(certType));
260262
bHasCertType = true;
261263
}
262264
break;
263265
case CKA_TOKEN:
264-
if (pTemplate[i].ulValueLen == sizeof(CK_BBOOL))
266+
if (pTemplate[i].ulValueLen == sizeof(CK_BBOOL) &&
267+
pTemplate[i].pValue != NULL_PTR)
265268
{
266-
isOnToken = *(CK_BBOOL*)pTemplate[i].pValue;
269+
memcpy(&isOnToken, pTemplate[i].pValue, sizeof(isOnToken));
267270
}
268271
break;
269272
case CKA_PRIVATE:
270-
if (pTemplate[i].ulValueLen == sizeof(CK_BBOOL))
273+
if (pTemplate[i].ulValueLen == sizeof(CK_BBOOL) &&
274+
pTemplate[i].pValue != NULL_PTR)
271275
{
272-
isPrivate = *(CK_BBOOL*)pTemplate[i].pValue;
276+
memcpy(&isPrivate, pTemplate[i].pValue, sizeof(isPrivate));
273277
bHasPrivate = true;
274278
}
275279
break;
@@ -1711,14 +1715,16 @@ CK_RV SoftHSM::C_CopyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject
17111715

17121716
for (CK_ULONG i = 0; i < ulCount; i++)
17131717
{
1714-
if ((pTemplate[i].type == CKA_TOKEN) && (pTemplate[i].ulValueLen == sizeof(CK_BBOOL)))
1718+
if ((pTemplate[i].type == CKA_TOKEN) && (pTemplate[i].ulValueLen == sizeof(CK_BBOOL)) &&
1719+
(pTemplate[i].pValue != NULL_PTR))
17151720
{
1716-
isOnToken = *(CK_BBOOL*)pTemplate[i].pValue;
1721+
memcpy(&isOnToken, pTemplate[i].pValue, sizeof(isOnToken));
17171722
continue;
17181723
}
1719-
if ((pTemplate[i].type == CKA_PRIVATE) && (pTemplate[i].ulValueLen == sizeof(CK_BBOOL)))
1724+
if ((pTemplate[i].type == CKA_PRIVATE) && (pTemplate[i].ulValueLen == sizeof(CK_BBOOL)) &&
1725+
(pTemplate[i].pValue != NULL_PTR))
17201726
{
1721-
isPrivate = *(CK_BBOOL*)pTemplate[i].pValue;
1727+
memcpy(&isPrivate, pTemplate[i].pValue, sizeof(isPrivate));
17221728
continue;
17231729
}
17241730
}
@@ -2080,9 +2086,12 @@ CK_RV SoftHSM::C_FindObjectsInit(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pT
20802086

20812087
if (attr.isBooleanAttribute())
20822088
{
2083-
if (sizeof(CK_BBOOL) != pTemplate[i].ulValueLen)
2089+
if (sizeof(CK_BBOOL) != pTemplate[i].ulValueLen ||
2090+
pTemplate[i].pValue == NULL_PTR)
20842091
break;
2085-
bool bTemplateValue = (*(CK_BBOOL*)pTemplate[i].pValue == CK_TRUE);
2092+
CK_BBOOL b = CK_FALSE;
2093+
memcpy(&b, pTemplate[i].pValue, sizeof(b));
2094+
bool bTemplateValue = (b == CK_TRUE);
20862095
if (attr.getBooleanValue() != bTemplateValue)
20872096
break;
20882097
}

0 commit comments

Comments
 (0)