<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21492">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, but someone else must approve
daniel: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gb_proxy: Use TLVP_PRES_LEN instead of TLVP_PRESENT<br><br>With TLVP_PRESENT we only check if a tiven TLV/IE is present,<br>but don't verify that it's length matches our expectation. This can<br>lead to out-of-bounds reads, so let's always use TLVP_PRES_LEN.<br><br>Change-Id: I1519cff0f6b2fe77f9a91eee17e0055d9df1bce6<br>---<br>M src/gbproxy/gb_proxy.c<br>M src/gbproxy/gb_proxy_peer.c<br>2 files changed, 17 insertions(+), 17 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gbproxy/gb_proxy.c b/src/gbproxy/gb_proxy.c</span><br><span>index 8b103c8..c130466 100644</span><br><span>--- a/src/gbproxy/gb_proxy.c</span><br><span>+++ b/src/gbproxy/gb_proxy.c</span><br><span>@@ -1017,7 +1017,7 @@</span><br><span> struct gbproxy_peer *from_peer = NULL;</span><br><span> uint16_t bvci;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!TLVP_PRESENT(tp, BSSGP_IE_BVCI) || !TLVP_PRESENT(tp, BSSGP_IE_CAUSE)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TLVP_PRES_LEN(tp, BSSGP_IE_BVCI, 2) || !TLVP_PRES_LEN(tp, BSSGP_IE_CAUSE, 1)) {</span><br><span> rate_ctr_inc(&cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_BSS]);</span><br><span> return bssgp_tx_status(BSSGP_CAUSE_MISSING_MAND_IE, NULL, msg);</span><br><span> }</span><br><span>@@ -1076,7 +1076,7 @@</span><br><span> gbproxy_peer_move(from_peer, nse_new);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (TLVP_PRESENT(tp, BSSGP_IE_CELL_ID)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRES_LEN(tp, BSSGP_IE_CELL_ID, 8)) {</span><br><span> struct gprs_ra_id raid;</span><br><span> /* We have a Cell Identifier present in this</span><br><span> * PDU, this means we can extend our local</span><br><span>@@ -1132,7 +1132,7 @@</span><br><span> * area identification. The snooped information is then used</span><br><span> * for routing the {SUSPEND,RESUME}_[N]ACK back to the correct</span><br><span> * BSSGP */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!TLVP_PRESENT(&tp, BSSGP_IE_ROUTEING_AREA))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TLVP_PRES_LEN(&tp, BSSGP_IE_ROUTEING_AREA, 6))</span><br><span> goto err_mand_ie;</span><br><span> from_peer = gbproxy_peer_by_nsei(cfg, nsei);</span><br><span> if (!from_peer)</span><br><span>@@ -1188,7 +1188,7 @@</span><br><span> </span><br><span> LOGP(DGPRS, LOGL_INFO, "NSE(%05u/SGSN) BSSGP PAGING\n",</span><br><span> nsei);</span><br><span style="color: hsl(0, 100%, 40%);">- if (TLVP_PRESENT(tp, BSSGP_IE_BVCI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRES_LEN(tp, BSSGP_IE_BVCI, 2)) {</span><br><span> uint16_t bvci = ntohs(tlvp_val16_unal(tp, BSSGP_IE_BVCI));</span><br><span> errctr = GBPROX_GLOB_CTR_OTHER_ERR;</span><br><span> peer = gbproxy_peer_by_bvci(cfg, bvci);</span><br><span>@@ -1200,7 +1200,7 @@</span><br><span> }</span><br><span> LOGPBVC(peer, LOGL_INFO, "routing by BVCI\n");</span><br><span> return gbprox_relay2peer(msg, peer, ns_bvci);</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (TLVP_PRESENT(tp, BSSGP_IE_ROUTEING_AREA)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (TLVP_PRES_LEN(tp, BSSGP_IE_ROUTEING_AREA, 6)) {</span><br><span> errctr = GBPROX_GLOB_CTR_INV_RAI;</span><br><span> /* iterate over all peers and dispatch the paging to each matching one */</span><br><span> llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span>@@ -1214,7 +1214,7 @@</span><br><span> }</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (TLVP_PRESENT(tp, BSSGP_IE_LOCATION_AREA)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (TLVP_PRES_LEN(tp, BSSGP_IE_LOCATION_AREA, 5)) {</span><br><span> errctr = GBPROX_GLOB_CTR_INV_LAI;</span><br><span> /* iterate over all peers and dispatch the paging to each matching one */</span><br><span> llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span>@@ -1228,7 +1228,7 @@</span><br><span> }</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (TLVP_PRESENT(tp, BSSGP_IE_BSS_AREA_ID)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (TLVP_PRES_LEN(tp, BSSGP_IE_BSS_AREA_ID, 1)) {</span><br><span> /* iterate over all peers and dispatch the paging to each matching one */</span><br><span> llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span> llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span>@@ -1264,7 +1264,7 @@</span><br><span> struct gbproxy_peer *peer;</span><br><span> uint16_t ptp_bvci;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!TLVP_PRESENT(tp, BSSGP_IE_BVCI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TLVP_PRES_LEN(tp, BSSGP_IE_BVCI, 2)) {</span><br><span> rate_ctr_inc(&cfg->ctrg-></span><br><span> ctr[GBPROX_GLOB_CTR_PROTO_ERR_SGSN]);</span><br><span> return bssgp_tx_status(BSSGP_CAUSE_MISSING_MAND_IE,</span><br><span>@@ -1347,7 +1347,7 @@</span><br><span> if (cfg->route_to_sgsn2 && nsei == cfg->nsip_sgsn2_nsei)</span><br><span> break;</span><br><span> /* simple case: BVCI IE is mandatory */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!TLVP_PRESENT(&tp, BSSGP_IE_BVCI))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TLVP_PRES_LEN(&tp, BSSGP_IE_BVCI, 2))</span><br><span> goto err_mand_ie;</span><br><span> bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span> if (bvci == BVCI_SIGNALLING) {</span><br><span>@@ -1358,7 +1358,7 @@</span><br><span> break;</span><br><span> case BSSGP_PDUT_FLUSH_LL:</span><br><span> /* simple case: BVCI IE is mandatory */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!TLVP_PRESENT(&tp, BSSGP_IE_BVCI))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TLVP_PRES_LEN(&tp, BSSGP_IE_BVCI, 2))</span><br><span> goto err_mand_ie;</span><br><span> bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span> rc = gbprox_relay2bvci(cfg, msg, bvci, ns_bvci);</span><br><span>@@ -1372,7 +1372,7 @@</span><br><span> /* Some exception has occurred */</span><br><span> LOGP(DGPRS, LOGL_NOTICE,</span><br><span> "NSE(%05u/SGSN) BSSGP STATUS ", nsei);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!TLVP_PRESENT(&tp, BSSGP_IE_CAUSE)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TLVP_PRES_LEN(&tp, BSSGP_IE_CAUSE, 1)) {</span><br><span> LOGPC(DGPRS, LOGL_NOTICE, "\n");</span><br><span> goto err_mand_ie;</span><br><span> }</span><br><span>@@ -1380,7 +1380,7 @@</span><br><span> LOGPC(DGPRS, LOGL_NOTICE,</span><br><span> "cause=0x%02x(%s) ", *TLVP_VAL(&tp, BSSGP_IE_CAUSE),</span><br><span> bssgp_cause_str(cause));</span><br><span style="color: hsl(0, 100%, 40%);">- if (TLVP_PRESENT(&tp, BSSGP_IE_BVCI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRES_LEN(&tp, BSSGP_IE_BVCI, 2)) {</span><br><span> bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span> LOGPC(DGPRS, LOGL_NOTICE, "BVCI=%05u\n", bvci);</span><br><span> </span><br><span>@@ -1395,7 +1395,7 @@</span><br><span> case BSSGP_PDUT_RESUME_ACK:</span><br><span> case BSSGP_PDUT_RESUME_NACK:</span><br><span> /* RAI IE is mandatory */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!TLVP_PRESENT(&tp, BSSGP_IE_ROUTEING_AREA))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TLVP_PRES_LEN(&tp, BSSGP_IE_ROUTEING_AREA, 6))</span><br><span> goto err_mand_ie;</span><br><span> peer = gbproxy_peer_by_rai(cfg, TLVP_VAL(&tp, BSSGP_IE_ROUTEING_AREA));</span><br><span> if (!peer)</span><br><span>@@ -1404,7 +1404,7 @@</span><br><span> break;</span><br><span> case BSSGP_PDUT_BVC_BLOCK_ACK:</span><br><span> case BSSGP_PDUT_BVC_UNBLOCK_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">- if (!TLVP_PRESENT(&tp, BSSGP_IE_BVCI))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TLVP_PRES_LEN(&tp, BSSGP_IE_BVCI, 2))</span><br><span> goto err_mand_ie;</span><br><span> bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span> if (bvci == 0) {</span><br><span>diff --git a/src/gbproxy/gb_proxy_peer.c b/src/gbproxy/gb_proxy_peer.c</span><br><span>index ea5fe1e..79ea8e3 100644</span><br><span>--- a/src/gbproxy/gb_proxy_peer.c</span><br><span>+++ b/src/gbproxy/gb_proxy_peer.c</span><br><span>@@ -165,7 +165,7 @@</span><br><span> struct gbproxy_peer *gbproxy_peer_by_bssgp_tlv(struct gbproxy_config *cfg,</span><br><span> struct tlv_parsed *tp)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (TLVP_PRESENT(tp, BSSGP_IE_BVCI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRES_LEN(tp, BSSGP_IE_BVCI, 2)) {</span><br><span> uint16_t bvci;</span><br><span> </span><br><span> bvci = ntohs(tlvp_val16_unal(tp, BSSGP_IE_BVCI));</span><br><span>@@ -174,7 +174,7 @@</span><br><span> }</span><br><span> </span><br><span> /* FIXME: this doesn't make sense, as RA can span multiple peers! */</span><br><span style="color: hsl(0, 100%, 40%);">- if (TLVP_PRESENT(tp, BSSGP_IE_ROUTEING_AREA)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRES_LEN(tp, BSSGP_IE_ROUTEING_AREA, 6)) {</span><br><span> uint8_t *rai = (uint8_t *)TLVP_VAL(tp, BSSGP_IE_ROUTEING_AREA);</span><br><span> /* Only compare LAC part, since MCC/MNC are possibly patched.</span><br><span> * Since the LAC of different BSS must be different when</span><br><span>@@ -183,7 +183,7 @@</span><br><span> }</span><br><span> </span><br><span> /* FIXME: this doesn't make sense, as LA can span multiple peers! */</span><br><span style="color: hsl(0, 100%, 40%);">- if (TLVP_PRESENT(tp, BSSGP_IE_LOCATION_AREA)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRES_LEN(tp, BSSGP_IE_LOCATION_AREA, 5)) {</span><br><span> uint8_t *lai = (uint8_t *)TLVP_VAL(tp, BSSGP_IE_LOCATION_AREA);</span><br><span> return gbproxy_peer_by_lac(cfg, lai);</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21492">change 21492</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21492"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-sgsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I1519cff0f6b2fe77f9a91eee17e0055d9df1bce6 </div>
<div style="display:none"> Gerrit-Change-Number: 21492 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>