Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow temporarily disabling device protection #2770

Merged
merged 35 commits into from
Jun 19, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
122fb42
Allow temporarily disabling protected device mode via a backup register
sergeuz May 16, 2024
8f20dec
Add a control request for temporarily disabling device protection
sergeuz May 20, 2024
8241e99
Minor fixes
sergeuz May 21, 2024
dd232bf
Add timeout for confirmation request
sergeuz May 23, 2024
ad2609d
Minor bugfixes and refactoring
sergeuz May 23, 2024
92634b9
Use a fake server key for testing
sergeuz May 24, 2024
7527d73
Bugfixes
sergeuz May 24, 2024
fc1568d
Allow disabling device protection on the fly
sergeuz May 29, 2024
126ce4d
Include server nonce in device signature
sergeuz May 29, 2024
276ae45
Check if the device is protected on every log operation
sergeuz May 30, 2024
e6b0f95
Remove the test key
sergeuz Jun 7, 2024
6ef4697
Bugfixes
sergeuz Jun 7, 2024
5145cb2
Regenerate Protobuf definitions; update submodule refs
sergeuz Jun 10, 2024
d4f6c0e
Bugfix
sergeuz Jun 10, 2024
49cd770
Regenerate Protobuf definitions; update submodule refs
sergeuz Jun 10, 2024
06ed956
Add device/server key fingerprints; minor refactoring
sergeuz Jun 10, 2024
0ea7f26
Minor fix
sergeuz Jun 10, 2024
0d0b6a4
Regenerate Protobuf definitions; update submodule refs
sergeuz Jun 10, 2024
171a6de
Minor fixes
sergeuz Jun 10, 2024
6633aca
Bugfix
sergeuz Jun 11, 2024
dd2f50c
Refactoring
sergeuz Jun 12, 2024
4cac07d
Do not disable logging when the device is protected
sergeuz Jun 12, 2024
46d4e6d
Disable Serial if the device is protected
sergeuz Jun 12, 2024
0b0a07f
Allow unprotecting the device over BLE
sergeuz Jun 14, 2024
f314d64
Fix GCC build
sergeuz Jun 14, 2024
2e07037
Fix newhal build
sergeuz Jun 14, 2024
03b1275
Fix rtl872x builds
sergeuz Jun 14, 2024
c116ce7
Clear the device protection override if the bootloader is not protected
sergeuz Jun 14, 2024
3c92c5d
Minor refactoring
sergeuz Jun 14, 2024
2a023fc
[gen3] disable IP_FRAG and IP_REASSEMBLY to save flash space
avtolstoy Jun 18, 2024
13605e3
Add a custom DfuSe command for entring safe mode
sergeuz Jun 18, 2024
dcf2c8f
[tracker] enable -fipa-pta (interprocedural pointer analysis and inte…
avtolstoy Jun 18, 2024
700bfc9
[build] extra -fdevirtualize-at-ltrans optimization for tracker
avtolstoy Jun 19, 2024
ad6f4d5
[build] clean up LTO usage
avtolstoy Jun 19, 2024
edefb7e
[build] more optimizations
avtolstoy Jun 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions hal/src/nRF52840/bootloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ uint16_t bootloader_get_version(void)
}

int bootloader_init_security_mode(void* reserved) {
// Skip setting the security mode if device protection is temporarily disabled
uint32_t disabled = HAL_Core_Read_Backup_Register(BKP_DR_08);
if (disabled) {
return 0;
}

CHECK_TRUE(FLASH_VerifyCRC32(FLASH_INTERNAL, BOOTLOADER_ADDR, FLASH_ModuleLength(FLASH_INTERNAL, BOOTLOADER_ADDR)), SYSTEM_ERROR_BAD_DATA);
module_info_security_mode_ext_t ext = {};
ext.ext.length = sizeof(ext);
Expand Down
6 changes: 6 additions & 0 deletions hal/src/rtl872x/bootloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,12 @@ uint16_t bootloader_get_version(void)
}

int bootloader_init_security_mode(void* reserved) {
// Skip setting the security mode if device protection is temporarily disabled
uint32_t disabled = HAL_Core_Read_Backup_Register(BKP_DR_08);
if (disabled) {
return 0;
}

CHECK_TRUE(FLASH_VerifyCRC32(FLASH_INTERNAL, BOOTLOADER_ADDR, FLASH_ModuleLength(FLASH_INTERNAL, BOOTLOADER_ADDR)), SYSTEM_ERROR_BAD_DATA);
module_info_security_mode_ext_t ext = {};
ext.ext.length = sizeof(ext);
Expand Down
2 changes: 1 addition & 1 deletion proto_defs/shared
7 changes: 7 additions & 0 deletions proto_defs/src/control/config.pb.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,12 @@ PB_BIND(particle_ctrl_GetProtectedStateRequest, particle_ctrl_GetProtectedStateR
PB_BIND(particle_ctrl_GetProtectedStateReply, particle_ctrl_GetProtectedStateReply, AUTO)


PB_BIND(particle_ctrl_SetProtectedStateRequest, particle_ctrl_SetProtectedStateRequest, AUTO)


PB_BIND(particle_ctrl_SetProtectedStateReply, particle_ctrl_SetProtectedStateReply, AUTO)


PB_BIND(particle_ctrl_SystemResetRequest, particle_ctrl_SystemResetRequest, AUTO)


Expand Down Expand Up @@ -168,3 +174,4 @@ PB_BIND(particle_ctrl_StopNyanSignalReply, particle_ctrl_StopNyanSignalReply, AU




65 changes: 61 additions & 4 deletions proto_defs/src/control/config.pb.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,13 @@ typedef enum _particle_ctrl_Feature {
particle_ctrl_Feature_ETHERNET_DETECTION = 1 /* Ethernet FeatherWing detection on boot */
} particle_ctrl_Feature;

/* Note: Use the same values as defined by the security_key_type enum */
typedef enum _particle_ctrl_SetProtectedStateRequest_Action {
particle_ctrl_SetProtectedStateRequest_Action_RESET = 0, /* Invalid key */
particle_ctrl_SetProtectedStateRequest_Action_DISABLE_REQUEST = 1, /* TCP device private key */
particle_ctrl_SetProtectedStateRequest_Action_DISABLE_CONFIRM = 2 /* TCP device public key */
} particle_ctrl_SetProtectedStateRequest_Action;

/* Struct definitions */
/* Get the device ID */
typedef struct _particle_ctrl_GetDeviceIdRequest {
Expand Down Expand Up @@ -208,6 +215,7 @@ typedef struct _particle_ctrl_GetNcpFirmwareVersionReply {

typedef struct _particle_ctrl_GetProtectedStateReply {
bool state;
bool overridden;
} particle_ctrl_GetProtectedStateReply;

typedef struct _particle_ctrl_GetSecurityKeyRequest {
Expand Down Expand Up @@ -261,6 +269,21 @@ typedef struct _particle_ctrl_SetFeatureRequest {
bool enabled;
} particle_ctrl_SetFeatureRequest;

typedef PB_BYTES_ARRAY_T(32) particle_ctrl_SetProtectedStateReply_client_nonce_t;
typedef struct _particle_ctrl_SetProtectedStateReply {
bool has_client_nonce;
particle_ctrl_SetProtectedStateReply_client_nonce_t client_nonce;
pb_callback_t client_signature;
} particle_ctrl_SetProtectedStateReply;

typedef PB_BYTES_ARRAY_T(32) particle_ctrl_SetProtectedStateRequest_server_nonce_t;
typedef struct _particle_ctrl_SetProtectedStateRequest {
particle_ctrl_SetProtectedStateRequest_Action action;
bool has_server_nonce;
particle_ctrl_SetProtectedStateRequest_server_nonce_t server_nonce;
pb_callback_t server_signature;
} particle_ctrl_SetProtectedStateRequest;

typedef struct _particle_ctrl_SetSecurityKeyRequest {
particle_ctrl_SecurityKeyType type; /* Key type */
pb_callback_t data; /* Key data in DER format */
Expand Down Expand Up @@ -309,6 +332,10 @@ typedef struct _particle_ctrl_SetStartupModeRequest {
#define _particle_ctrl_Feature_MAX particle_ctrl_Feature_ETHERNET_DETECTION
#define _particle_ctrl_Feature_ARRAYSIZE ((particle_ctrl_Feature)(particle_ctrl_Feature_ETHERNET_DETECTION+1))

#define _particle_ctrl_SetProtectedStateRequest_Action_MIN particle_ctrl_SetProtectedStateRequest_Action_RESET
#define _particle_ctrl_SetProtectedStateRequest_Action_MAX particle_ctrl_SetProtectedStateRequest_Action_DISABLE_CONFIRM
#define _particle_ctrl_SetProtectedStateRequest_Action_ARRAYSIZE ((particle_ctrl_SetProtectedStateRequest_Action)(particle_ctrl_SetProtectedStateRequest_Action_DISABLE_CONFIRM+1))


#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -356,7 +383,9 @@ extern "C" {
#define particle_ctrl_SetStartupModeRequest_init_default {_particle_ctrl_DeviceMode_MIN}
#define particle_ctrl_SetStartupModeReply_init_default {0}
#define particle_ctrl_GetProtectedStateRequest_init_default {0}
#define particle_ctrl_GetProtectedStateReply_init_default {0}
#define particle_ctrl_GetProtectedStateReply_init_default {0, 0}
#define particle_ctrl_SetProtectedStateRequest_init_default {_particle_ctrl_SetProtectedStateRequest_Action_MIN, false, {0, {0}}, {{NULL}, NULL}}
#define particle_ctrl_SetProtectedStateReply_init_default {false, {0, {0}}, {{NULL}, NULL}}
#define particle_ctrl_SystemResetRequest_init_default {0}
#define particle_ctrl_SystemResetReply_init_default {0}
#define particle_ctrl_SetFeatureRequest_init_default {_particle_ctrl_Feature_MIN, 0}
Expand Down Expand Up @@ -408,7 +437,9 @@ extern "C" {
#define particle_ctrl_SetStartupModeRequest_init_zero {_particle_ctrl_DeviceMode_MIN}
#define particle_ctrl_SetStartupModeReply_init_zero {0}
#define particle_ctrl_GetProtectedStateRequest_init_zero {0}
#define particle_ctrl_GetProtectedStateReply_init_zero {0}
#define particle_ctrl_GetProtectedStateReply_init_zero {0, 0}
#define particle_ctrl_SetProtectedStateRequest_init_zero {_particle_ctrl_SetProtectedStateRequest_Action_MIN, false, {0, {0}}, {{NULL}, NULL}}
#define particle_ctrl_SetProtectedStateReply_init_zero {false, {0, {0}}, {{NULL}, NULL}}
#define particle_ctrl_SystemResetRequest_init_zero {0}
#define particle_ctrl_SystemResetReply_init_zero {0}
#define particle_ctrl_SetFeatureRequest_init_zero {_particle_ctrl_Feature_MIN, 0}
Expand All @@ -430,6 +461,7 @@ extern "C" {
#define particle_ctrl_GetNcpFirmwareVersionReply_version_tag 1
#define particle_ctrl_GetNcpFirmwareVersionReply_module_version_tag 2
#define particle_ctrl_GetProtectedStateReply_state_tag 1
#define particle_ctrl_GetProtectedStateReply_overridden_tag 2
#define particle_ctrl_GetSecurityKeyRequest_type_tag 1
#define particle_ctrl_GetSerialNumberReply_serial_tag 1
#define particle_ctrl_GetServerAddressReply_address_tag 1
Expand All @@ -443,6 +475,11 @@ extern "C" {
#define particle_ctrl_SetDeviceSetupDoneRequest_done_tag 1
#define particle_ctrl_SetFeatureRequest_feature_tag 1
#define particle_ctrl_SetFeatureRequest_enabled_tag 2
#define particle_ctrl_SetProtectedStateReply_client_nonce_tag 1
#define particle_ctrl_SetProtectedStateReply_client_signature_tag 2
#define particle_ctrl_SetProtectedStateRequest_action_tag 1
#define particle_ctrl_SetProtectedStateRequest_server_nonce_tag 2
#define particle_ctrl_SetProtectedStateRequest_server_signature_tag 3
#define particle_ctrl_SetSecurityKeyRequest_type_tag 1
#define particle_ctrl_SetSecurityKeyRequest_data_tag 2
#define particle_ctrl_SetServerAddressRequest_protocol_tag 1
Expand Down Expand Up @@ -666,10 +703,24 @@ X(a, STATIC, SINGULAR, UENUM, mode, 1)
#define particle_ctrl_GetProtectedStateRequest_DEFAULT NULL

#define particle_ctrl_GetProtectedStateReply_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, BOOL, state, 1)
X(a, STATIC, SINGULAR, BOOL, state, 1) \
X(a, STATIC, SINGULAR, BOOL, overridden, 2)
#define particle_ctrl_GetProtectedStateReply_CALLBACK NULL
#define particle_ctrl_GetProtectedStateReply_DEFAULT NULL

#define particle_ctrl_SetProtectedStateRequest_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UENUM, action, 1) \
X(a, STATIC, OPTIONAL, BYTES, server_nonce, 2) \
X(a, CALLBACK, OPTIONAL, BYTES, server_signature, 3)
#define particle_ctrl_SetProtectedStateRequest_CALLBACK pb_default_field_callback
#define particle_ctrl_SetProtectedStateRequest_DEFAULT NULL

#define particle_ctrl_SetProtectedStateReply_FIELDLIST(X, a) \
X(a, STATIC, OPTIONAL, BYTES, client_nonce, 1) \
X(a, CALLBACK, OPTIONAL, BYTES, client_signature, 2)
#define particle_ctrl_SetProtectedStateReply_CALLBACK pb_default_field_callback
#define particle_ctrl_SetProtectedStateReply_DEFAULT NULL

#define particle_ctrl_SystemResetRequest_FIELDLIST(X, a) \

#define particle_ctrl_SystemResetRequest_CALLBACK NULL
Expand Down Expand Up @@ -763,6 +814,8 @@ extern const pb_msgdesc_t particle_ctrl_SetStartupModeRequest_msg;
extern const pb_msgdesc_t particle_ctrl_SetStartupModeReply_msg;
extern const pb_msgdesc_t particle_ctrl_GetProtectedStateRequest_msg;
extern const pb_msgdesc_t particle_ctrl_GetProtectedStateReply_msg;
extern const pb_msgdesc_t particle_ctrl_SetProtectedStateRequest_msg;
extern const pb_msgdesc_t particle_ctrl_SetProtectedStateReply_msg;
extern const pb_msgdesc_t particle_ctrl_SystemResetRequest_msg;
extern const pb_msgdesc_t particle_ctrl_SystemResetReply_msg;
extern const pb_msgdesc_t particle_ctrl_SetFeatureRequest_msg;
Expand Down Expand Up @@ -817,6 +870,8 @@ extern const pb_msgdesc_t particle_ctrl_StopNyanSignalReply_msg;
#define particle_ctrl_SetStartupModeReply_fields &particle_ctrl_SetStartupModeReply_msg
#define particle_ctrl_GetProtectedStateRequest_fields &particle_ctrl_GetProtectedStateRequest_msg
#define particle_ctrl_GetProtectedStateReply_fields &particle_ctrl_GetProtectedStateReply_msg
#define particle_ctrl_SetProtectedStateRequest_fields &particle_ctrl_SetProtectedStateRequest_msg
#define particle_ctrl_SetProtectedStateReply_fields &particle_ctrl_SetProtectedStateReply_msg
#define particle_ctrl_SystemResetRequest_fields &particle_ctrl_SystemResetRequest_msg
#define particle_ctrl_SystemResetReply_fields &particle_ctrl_SystemResetReply_msg
#define particle_ctrl_SetFeatureRequest_fields &particle_ctrl_SetFeatureRequest_msg
Expand All @@ -834,14 +889,16 @@ extern const pb_msgdesc_t particle_ctrl_StopNyanSignalReply_msg;
/* particle_ctrl_SetSecurityKeyRequest_size depends on runtime parameters */
/* particle_ctrl_GetSecurityKeyReply_size depends on runtime parameters */
/* particle_ctrl_GetServerAddressReply_size depends on runtime parameters */
/* particle_ctrl_SetProtectedStateRequest_size depends on runtime parameters */
/* particle_ctrl_SetProtectedStateReply_size depends on runtime parameters */
#define particle_ctrl_GetDeviceIdReply_size 26
#define particle_ctrl_GetDeviceIdRequest_size 0
#define particle_ctrl_GetDeviceModeReply_size 2
#define particle_ctrl_GetDeviceModeRequest_size 0
#define particle_ctrl_GetFeatureReply_size 2
#define particle_ctrl_GetFeatureRequest_size 2
#define particle_ctrl_GetNcpFirmwareVersionRequest_size 0
#define particle_ctrl_GetProtectedStateReply_size 2
#define particle_ctrl_GetProtectedStateReply_size 4
#define particle_ctrl_GetProtectedStateRequest_size 0
#define particle_ctrl_GetSecurityKeyRequest_size 2
#define particle_ctrl_GetSerialNumberReply_size 18
Expand Down
1 change: 1 addition & 0 deletions services/src/security_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ int security_mode_check_request(security_mode_transport transport, uint16_t id)

if (transport == SECURITY_MODE_TRANSPORT_USB || transport == SECURITY_MODE_TRANSPORT_BLE) {
switch (id) {
case CTRL_REQUEST_SET_PROTECTED_STATE:
case CTRL_REQUEST_GET_PROTECTED_STATE:
case CTRL_REQUEST_DEVICE_ID:
case CTRL_REQUEST_APP_CUSTOM: {
Expand Down
1 change: 1 addition & 0 deletions system/inc/system_control.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ typedef enum ctrl_request_type {
CTRL_REQUEST_IS_DEVICE_SETUP_DONE = 74,
CTRL_REQUEST_SET_STARTUP_MODE = 75,
CTRL_REQUEST_GET_PROTECTED_STATE = 76,
CTRL_REQUEST_SET_PROTECTED_STATE = 77,
CTRL_REQUEST_LOG_CONFIG = 80,
CTRL_REQUEST_GET_MODULE_INFO = 90,
CTRL_REQUEST_GET_ASSET_INFO = 91,
Expand Down
Loading