Skip to content

Commit 32c0251

Browse files
committed
F-2369 - https://fenrir.wolfssl.com/finding/2369 - Enforce CKA_PRIVATE access control in WP11_Object_Find
1 parent c323b5a commit 32c0251

2 files changed

Lines changed: 80 additions & 2 deletions

File tree

src/internal.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9154,8 +9154,24 @@ int WP11_Object_Find(WP11_Session* session, CK_OBJECT_HANDLE objHandle,
91549154
WP11_Lock_UnlockRO(&session->slot->token.lock);
91559155
}
91569156

9157-
if (obj && (obj->handle == objHandle))
9158-
*object = obj;
9157+
if (ret == 0 && obj != NULL && (obj->handle == objHandle)) {
9158+
/* Enforce CKA_PRIVATE: reject private objects from public sessions */
9159+
if ((obj->opFlag & WP11_FLAG_PRIVATE) == WP11_FLAG_PRIVATE) {
9160+
int loginState;
9161+
if (!onToken)
9162+
WP11_Lock_LockRO(&session->slot->token.lock);
9163+
loginState = session->slot->token.loginState;
9164+
if (!WP11_Slot_Has_Empty_Pin(session->slot) &&
9165+
(loginState == WP11_APP_STATE_RW_PUBLIC ||
9166+
loginState == WP11_APP_STATE_RO_PUBLIC)) {
9167+
ret = BAD_FUNC_ARG;
9168+
}
9169+
if (!onToken)
9170+
WP11_Lock_UnlockRO(&session->slot->token.lock);
9171+
}
9172+
if (ret == 0)
9173+
*object = obj;
9174+
}
91599175

91609176
return ret;
91619177
}

tests/pkcs11test.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16461,6 +16461,67 @@ static CK_RV test_private_object_access(void* args)
1646116461
return ret;
1646216462
}
1646316463

16464+
static CK_RV test_private_object_handle_access(void* args)
16465+
{
16466+
CK_SESSION_HANDLE session = *(CK_SESSION_HANDLE*)args;
16467+
CK_RV ret;
16468+
CK_OBJECT_HANDLE obj = CK_INVALID_HANDLE;
16469+
static byte keyData[] = { 0x01, 0x02, 0x03, 0x04 };
16470+
CK_BBOOL isPrivate = CK_TRUE;
16471+
CK_ATTRIBUTE tmpl[] = {
16472+
{ CKA_CLASS, &secretKeyClass, sizeof(secretKeyClass) },
16473+
{ CKA_KEY_TYPE, &genericKeyType, sizeof(genericKeyType) },
16474+
{ CKA_VALUE, keyData, sizeof(keyData) },
16475+
{ CKA_PRIVATE, &isPrivate, sizeof(isPrivate) },
16476+
{ CKA_TOKEN, &ckTrue, sizeof(ckTrue) },
16477+
};
16478+
CK_ULONG tmplCnt = sizeof(tmpl) / sizeof(*tmpl);
16479+
CK_ULONG valueLen = 0;
16480+
CK_ATTRIBUTE getValueTmpl = { CKA_VALUE_LEN, &valueLen, sizeof(valueLen) };
16481+
byte iv[16];
16482+
CK_MECHANISM mech;
16483+
16484+
memset(iv, 9, sizeof(iv));
16485+
mech.mechanism = CKM_SHA256_HMAC;
16486+
mech.ulParameterLen = 0;
16487+
mech.pParameter = NULL;
16488+
16489+
/* Create a private token object while logged in */
16490+
ret = funcList->C_CreateObject(session, tmpl, tmplCnt, &obj);
16491+
CHECK_CKR(ret, "Create Private Object for handle test");
16492+
16493+
if (ret == CKR_OK) {
16494+
ret = funcList->C_Logout(session);
16495+
CHECK_CKR(ret, "Logout for handle test");
16496+
}
16497+
16498+
/* Try direct handle access via C_GetAttributeValue — should fail */
16499+
if (ret == CKR_OK) {
16500+
ret = funcList->C_GetAttributeValue(session, obj, &getValueTmpl, 1);
16501+
CHECK_CKR_FAIL(ret, CKR_OBJECT_HANDLE_INVALID,
16502+
"GetAttributeValue on private obj when not logged in");
16503+
}
16504+
16505+
/* Try direct handle access via C_SignInit — should fail */
16506+
if (ret == CKR_OK) {
16507+
ret = funcList->C_SignInit(session, &mech, obj);
16508+
CHECK_CKR_FAIL(ret, CKR_OBJECT_HANDLE_INVALID,
16509+
"SignInit on private obj when not logged in");
16510+
}
16511+
16512+
/* Re-login and clean up */
16513+
if (ret == CKR_OK) {
16514+
ret = funcList->C_Login(session, CKU_USER, userPin, userPinLen);
16515+
CHECK_CKR(ret, "Re-login after handle test");
16516+
}
16517+
16518+
if (obj != CK_INVALID_HANDLE) {
16519+
funcList->C_DestroyObject(session, obj);
16520+
}
16521+
16522+
return ret;
16523+
}
16524+
1646416525
/* C_GetAttributeValue must process all attributes in the template even when one
1646516526
* returns an error, setting ulValueLen to (CK_ULONG)-1 for invalid types and
1646616527
* returning the accumulated error. */
@@ -16994,6 +17055,7 @@ static TEST_FUNC testFunc[] = {
1699417055
PKCS11TEST_FUNC_SESS_DECL(test_get_attr_value_all_processed),
1699517056
PKCS11TEST_FUNC_SESS_DECL(test_find_objects),
1699617057
PKCS11TEST_FUNC_SESS_DECL(test_private_object_access),
17058+
PKCS11TEST_FUNC_SESS_DECL(test_private_object_handle_access),
1699717059
PKCS11TEST_FUNC_SESS_DECL(test_encrypt_decrypt),
1699817060
#ifndef NO_AES
1699917061
PKCS11TEST_FUNC_SESS_DECL(test_encrypt_decrypt_op_not_supported),

0 commit comments

Comments
 (0)