provide a mechnism to exclude some CI+ SAC messages from being

exported in the clear by the export PDU mechanism

use this mechanism to exclude SAC messages that contain CCK precursor data
(Exporting this is not a security issue, but people should be aware of what
 they're doing. It's safer to exlude those messages and prevent people from
 exporting them accidentially.)

svn path=/trunk/; revision=51037
This commit is contained in:
Martin Kaiser 2013-07-30 20:05:49 +00:00
parent 430bd9eacc
commit 2f42b3b031
1 changed files with 48 additions and 14 deletions

View File

@ -1869,11 +1869,29 @@ dissect_conn_desc(tvbuff_t *tvb, gint offset, circuit_t *circuit,
}
/* dissect an item from cc_data_req/cc_data_cnf,
returns its length or -1 for error */
/* check if the given CC resource item may appear in the clear
as part of an exported PDU */
static inline gboolean
is_cc_item_exportable(guint8 dat_id)
{
/* the CCK precursor value does not contain sensitive information as such
nevertheless, it is safer to prevent people from exporting this value
accidentially */
if (dat_id == CC_ID_KP)
return FALSE;
/* we could add some more items here which do not appear in SAC messages
normally: CC_ID_DHPH, CC_ID_DHPM */
return TRUE;
}
/* dissect an item from cc_(sac_)data_req/cc_(sac_)data_cnf,
returns its length or -1 for error
if dat_id_ptr is not NULL, fill in the datatype id */
static gint
dissect_cc_item(tvbuff_t *tvb, gint offset,
packet_info *pinfo, proto_tree *tree)
packet_info *pinfo, proto_tree *tree, guint8 *dat_id_ptr)
{
proto_item *ti = NULL;
proto_tree *cc_item_tree = NULL;
@ -1889,6 +1907,8 @@ dissect_cc_item(tvbuff_t *tvb, gint offset,
offset_start = offset;
dat_id = tvb_get_guint8(tvb, offset);
if (dat_id_ptr)
*dat_id_ptr = dat_id;
ti = proto_tree_add_text(tree, tvb, offset_start, -1, "CC data item: %s",
val_to_str_const(dat_id, dvbci_cc_dat_id, "unknown"));
@ -1972,14 +1992,27 @@ dissect_cc_item(tvbuff_t *tvb, gint offset,
}
/* dissect the payload of a cc message that contains data items
if not NULL, set exportable_flag to TRUE if the message contains no
sensitive data and can be passed to the export PDU mechanism */
static gint
dissect_cc_data_payload(guint32 tag, tvbuff_t *tvb, gint offset,
packet_info *pinfo, proto_tree *tree)
dissect_cc_data_payload(guint32 tag, tvbuff_t *tvb, gint offset,
packet_info *pinfo, proto_tree *tree, gboolean *exportable_flag)
{
gint offset_start;
guint8 i, snd_dat_nbr, req_dat_nbr;
guint8 dat_id;
gint item_len;
/* we only export cc_sac_data_req and cc_sac_data_cnf
the only meta info in the exported PDU is the data transfer
direction, if we only ever export cc_sac_data_req and
cc_sac_data_cnf, this info is enough to recover the apdu tag from the
direction
cc_sac_sync req and cc_sac_sync_cnf contain no interesting data */
if (exportable_flag)
*exportable_flag = (tag==T_CC_SAC_DATA_REQ || tag==T_CC_SAC_DATA_CNF);
offset_start = offset;
proto_tree_add_item(
@ -1991,10 +2024,14 @@ dissect_cc_data_payload(guint32 tag, tvbuff_t *tvb, gint offset,
offset++;
for(i=0; i<snd_dat_nbr &&
tvb_reported_length_remaining(tvb, offset)>0; i++) {
item_len = dissect_cc_item(tvb, offset, pinfo, tree);
item_len = dissect_cc_item(tvb, offset, pinfo, tree, &dat_id);
if (item_len < 0)
return -1;
offset += item_len;
if (!exportable_flag || *exportable_flag==FALSE)
continue;
if (!is_cc_item_exportable(dat_id))
*exportable_flag = FALSE;
}
if (tag==T_CC_DATA_REQ || tag==T_CC_SAC_DATA_REQ) {
req_dat_nbr = tvb_get_guint8(tvb, offset);
@ -3027,6 +3064,7 @@ dissect_sac_msg(guint32 tag, tvbuff_t *tvb, gint offset,
gint sac_payload_data_len = 0; /* just payload data */
tvbuff_t *clear_sac_body_tvb;
proto_tree *sac_tree = NULL;
gboolean is_exportable = FALSE;
offset_start = offset;
@ -3082,7 +3120,7 @@ dissect_sac_msg(guint32 tag, tvbuff_t *tvb, gint offset,
sac_tree = proto_item_add_subtree(ti, ett_dvbci_sac_msg_body);
if (tag==T_CC_SAC_DATA_REQ || tag==T_CC_SAC_DATA_CNF) {
sac_payload_data_len = dissect_cc_data_payload(tag,
clear_sac_body_tvb, 0, pinfo, sac_tree);
clear_sac_body_tvb, 0, pinfo, sac_tree, &is_exportable);
}
else if (tag==T_CC_SAC_SYNC_REQ) {
sac_payload_data_len = 0;
@ -3108,12 +3146,8 @@ dissect_sac_msg(guint32 tag, tvbuff_t *tvb, gint offset,
sac_payload_len), ENC_NA);
/* we call this function also to dissect exported SAC messages,
dont' try to export them a second time
we only export cc_sac_data_req and cc_sac_data_cnf,
sync req and cnf contain no encrypted data */
if (!exported &&
(tag==T_CC_SAC_DATA_REQ || tag==T_CC_SAC_DATA_CNF) &&
have_tap_listener(exported_pdu_tap)) {
dont' try to export them a second time */
if (!exported && is_exportable && have_tap_listener(exported_pdu_tap)) {
tvbuff_t *clear_sac_msg_tvb;
exp_pdu_data_t *exp_pdu_data;
@ -3181,7 +3215,7 @@ dissect_dvbci_payload_cc(guint32 tag, gint len_field _U_,
break;
case T_CC_DATA_REQ:
case T_CC_DATA_CNF:
dissect_cc_data_payload(tag, tvb, offset, pinfo, tree);
dissect_cc_data_payload(tag, tvb, offset, pinfo, tree, NULL);
break;
case T_CC_SYNC_CNF:
status = tvb_get_guint8(tvb, offset);