VYPR
Medium severity5.5NVD Advisory· Published Apr 16, 2025· Updated Apr 2, 2026

CVE-2025-22117

CVE-2025-22117

Description

In the Linux kernel, the following vulnerability has been resolved:

ice: fix using untrusted value of pkt_len in ice_vc_fdir_parse_raw()

Fix using the untrusted value of proto->raw.pkt_len in function ice_vc_fdir_parse_raw() by verifying if it does not exceed the VIRTCHNL_MAX_SIZE_RAW_PACKET value.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

In the Linux kernel's ice driver, an untrusted packet length value in ice_vc_fdir_parse_raw() could cause memory corruption; fixed by adding a bounds check.

Vulnerability

Overview

CVE-2025-22117 is a medium-severity vulnerability in the Linux kernel's Intel Ethernet Connection (ice) driver. The flaw resides in the ice_vc_fdir_parse_raw() function, which handles raw packet descriptors for flow director (fdir) rules over the virtual channel (VC). The function failed to validate the pkt_len field from a raw packet descriptor, allowing an untrusted value to be used without checking against the maximum allowed size (VIRTCHNL_MAX_SIZE_RAW_PACKET) [1].

Exploitation

Prerequisites

Exploitation requires a malicious or compromised virtual function (VF) that can send crafted VC messages to the physical function (PF) driver. No special privileges beyond VF access are needed, but the attacker must be able to communicate with the ice driver's VC interface. The lack of bounds checking means a VF could supply an excessively large pkt_len, leading to potential out-of-bounds memory access or buffer overflow in the kernel [1].

Impact

If successfully exploited, an attacker could cause a denial of service (system crash or hang) or potentially corrupt kernel memory, which might lead to privilege escalation. The CVSS v3 base score of 5.5 reflects the need for local access (VF) and the possibility of high impact on availability and integrity [1].

Mitigation

The fix was applied in the Linux kernel stable tree by adding a validation check that ensures pkt_len does not exceed VIRTCHNL_MAX_SIZE_RAW_PACKET. Users should update to a kernel version containing the commit referenced in [1] or later stable releases. No workarounds are documented; the vulnerability is patched in the mainline kernel.

AI Insight generated on May 20, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected products

10

Patches

2
1388dd564183

ice: fix using untrusted value of pkt_len in ice_vc_fdir_parse_raw()

1 file changed · +15 10
  • drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c+15 10 modified
    diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
    index 14e3f0f89c78d..9be4bd717512d 100644
    --- a/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
    +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
    @@ -832,21 +832,27 @@ ice_vc_fdir_parse_raw(struct ice_vf *vf,
     		      struct virtchnl_proto_hdrs *proto,
     		      struct virtchnl_fdir_fltr_conf *conf)
     {
    -	u8 *pkt_buf, *msk_buf __free(kfree);
    +	u8 *pkt_buf, *msk_buf __free(kfree) = NULL;
     	struct ice_parser_result rslt;
     	struct ice_pf *pf = vf->pf;
    +	u16 pkt_len, udp_port = 0;
     	struct ice_parser *psr;
     	int status = -ENOMEM;
     	struct ice_hw *hw;
    -	u16 udp_port = 0;
     
    -	pkt_buf = kzalloc(proto->raw.pkt_len, GFP_KERNEL);
    -	msk_buf = kzalloc(proto->raw.pkt_len, GFP_KERNEL);
    +	pkt_len = proto->raw.pkt_len;
    +
    +	if (!pkt_len || pkt_len > VIRTCHNL_MAX_SIZE_RAW_PACKET)
    +		return -EINVAL;
    +
    +	pkt_buf = kzalloc(pkt_len, GFP_KERNEL);
    +	msk_buf = kzalloc(pkt_len, GFP_KERNEL);
    +
     	if (!pkt_buf || !msk_buf)
     		goto err_mem_alloc;
     
    -	memcpy(pkt_buf, proto->raw.spec, proto->raw.pkt_len);
    -	memcpy(msk_buf, proto->raw.mask, proto->raw.pkt_len);
    +	memcpy(pkt_buf, proto->raw.spec, pkt_len);
    +	memcpy(msk_buf, proto->raw.mask, pkt_len);
     
     	hw = &pf->hw;
     
    @@ -862,7 +868,7 @@ ice_vc_fdir_parse_raw(struct ice_vf *vf,
     	if (ice_get_open_tunnel_port(hw, &udp_port, TNL_VXLAN))
     		ice_parser_vxlan_tunnel_set(psr, udp_port, true);
     
    -	status = ice_parser_run(psr, pkt_buf, proto->raw.pkt_len, &rslt);
    +	status = ice_parser_run(psr, pkt_buf, pkt_len, &rslt);
     	if (status)
     		goto err_parser_destroy;
     
    @@ -876,7 +882,7 @@ ice_vc_fdir_parse_raw(struct ice_vf *vf,
     	}
     
     	status = ice_parser_profile_init(&rslt, pkt_buf, msk_buf,
    -					 proto->raw.pkt_len, ICE_BLK_FD,
    +					 pkt_len, ICE_BLK_FD,
     					 conf->prof);
     	if (status)
     		goto err_parser_profile_init;
    @@ -885,7 +891,7 @@ ice_vc_fdir_parse_raw(struct ice_vf *vf,
     		ice_parser_profile_dump(hw, conf->prof);
     
     	/* Store raw flow info into @conf */
    -	conf->pkt_len = proto->raw.pkt_len;
    +	conf->pkt_len = pkt_len;
     	conf->pkt_buf = pkt_buf;
     	conf->parser_ena = true;
     
    -- 
    cgit 1.3-korg
    
    
    
362f704ba73a

ice: fix using untrusted value of pkt_len in ice_vc_fdir_parse_raw()

1 file changed · +15 10
  • drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c+15 10 modified
    diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
    index 14e3f0f89c78d..9be4bd717512d 100644
    --- a/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
    +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c
    @@ -832,21 +832,27 @@ ice_vc_fdir_parse_raw(struct ice_vf *vf,
     		      struct virtchnl_proto_hdrs *proto,
     		      struct virtchnl_fdir_fltr_conf *conf)
     {
    -	u8 *pkt_buf, *msk_buf __free(kfree);
    +	u8 *pkt_buf, *msk_buf __free(kfree) = NULL;
     	struct ice_parser_result rslt;
     	struct ice_pf *pf = vf->pf;
    +	u16 pkt_len, udp_port = 0;
     	struct ice_parser *psr;
     	int status = -ENOMEM;
     	struct ice_hw *hw;
    -	u16 udp_port = 0;
     
    -	pkt_buf = kzalloc(proto->raw.pkt_len, GFP_KERNEL);
    -	msk_buf = kzalloc(proto->raw.pkt_len, GFP_KERNEL);
    +	pkt_len = proto->raw.pkt_len;
    +
    +	if (!pkt_len || pkt_len > VIRTCHNL_MAX_SIZE_RAW_PACKET)
    +		return -EINVAL;
    +
    +	pkt_buf = kzalloc(pkt_len, GFP_KERNEL);
    +	msk_buf = kzalloc(pkt_len, GFP_KERNEL);
    +
     	if (!pkt_buf || !msk_buf)
     		goto err_mem_alloc;
     
    -	memcpy(pkt_buf, proto->raw.spec, proto->raw.pkt_len);
    -	memcpy(msk_buf, proto->raw.mask, proto->raw.pkt_len);
    +	memcpy(pkt_buf, proto->raw.spec, pkt_len);
    +	memcpy(msk_buf, proto->raw.mask, pkt_len);
     
     	hw = &pf->hw;
     
    @@ -862,7 +868,7 @@ ice_vc_fdir_parse_raw(struct ice_vf *vf,
     	if (ice_get_open_tunnel_port(hw, &udp_port, TNL_VXLAN))
     		ice_parser_vxlan_tunnel_set(psr, udp_port, true);
     
    -	status = ice_parser_run(psr, pkt_buf, proto->raw.pkt_len, &rslt);
    +	status = ice_parser_run(psr, pkt_buf, pkt_len, &rslt);
     	if (status)
     		goto err_parser_destroy;
     
    @@ -876,7 +882,7 @@ ice_vc_fdir_parse_raw(struct ice_vf *vf,
     	}
     
     	status = ice_parser_profile_init(&rslt, pkt_buf, msk_buf,
    -					 proto->raw.pkt_len, ICE_BLK_FD,
    +					 pkt_len, ICE_BLK_FD,
     					 conf->prof);
     	if (status)
     		goto err_parser_profile_init;
    @@ -885,7 +891,7 @@ ice_vc_fdir_parse_raw(struct ice_vf *vf,
     		ice_parser_profile_dump(hw, conf->prof);
     
     	/* Store raw flow info into @conf */
    -	conf->pkt_len = proto->raw.pkt_len;
    +	conf->pkt_len = pkt_len;
     	conf->pkt_buf = pkt_buf;
     	conf->parser_ena = true;
     
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

AI mechanics synthesis has not run for this CVE yet.

References

3

News mentions

0

No linked articles in our index yet.