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

config/mt: Add vlan-tuple MT selector #10015

Closed
wants to merge 3 commits into from
Closed

Conversation

jlucovsky
Copy link
Contributor

@jlucovsky jlucovsky commented Dec 8, 2023

Continuation of #10005

Add a new MT selector type to support use cases where a VLAN tuple should be used to determine the MT tenant.

Packets with one VLAN id will never match as vlan-tuple requires at least QinQ.

The tuple can hold up to 3 values -- this is the max supported by Suricata atm.

Tenants are selected by specifying a VLAN tuple, e.g., [1010, 5]. A packet matches when:

  • It has double VLAN encapsulation
  • The outer VLAN id is 1015
  • The inner VLAN id is 5

Wild card values are supported; values of 0 match 'any VLAN' value in the same position as expressed in the tuple:
Tenants are selected by specifying a VLAN tuple, e.g., [1010, 0]. A packet matches when:

  • It has double VLAN encapsulation
  • The outer VLAN id is 1015
  • The inner VLAN id always matches since it's a wildcard value.

Link to redmine ticket: 6237

Describe changes:

  • Add and document a new MT selector -- vlan-tuple -- for use cases where a VLAN pair should determines the tenant.

Updates

  • Rebase

Provide values to any of the below to override the defaults.

To use a pull request use a branch name like pr/N where N is the
pull request number.

Alternatively, SV_BRANCH may also be a link to an
OISF/suricata-verify pull-request.

SV_REPO=
SV_BRANCH=pr/1354
SU_REPO=
SU_BRANCH=
LIBHTP_REPO=
LIBHTP_BRANCH=

Issue: 6237

The VLAN tuple selector uses a tuple of values to select a tenant.
- [ vlan-outermost, vlan-innermost]

The tuple can contain as many VLAN values as supported by Suricata -
currently 3.

Each of these can accept a wild-card value (0).

The tenant is selected by matching packet VLAN values with the selector
values.
Show the default value used for the unix control socket instead of a
generic name that's not used: custom.socket
Copy link
Contributor

@jufajardini jufajardini left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tough work writing documentation! From my end, things are looking good :)

@suricata-qa
Copy link

Information: QA ran without warnings.

Pipeline 16965

the selector ``vlan`` (default); the selector ``vlan-tuple`` should be used if QinQ is deployed and requires both
the inner and outer VLAN id values to match to determine the tenant.
Multiple VLANs can have the same tenant id. VLAN id values must be between 1 and 4094 with the ``vlan`` selector.
A wildcard value of ``00`` can be used with the ``vlan-tuple`` selector.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why double 0 here ?

"type": int,
"variable": 1,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this file for ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this variable be a bool ?

SCLogError("vlan value %s is invalid; must be 0-4094", field->val);
goto bad_mapping;
}
traffic_id.vlan.tuple[idx++] = vlan_id;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can overflow by specifying a bad config with too many clans ? (we should bounds check on idx)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks -- will protect this.

} else {
args.vlan.tuple[count++] = (uint16_t)json_integer_value(hargs);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should return early, should we not ?
We are not expecting hargs_tuple if we got hargs

answer, "message", json_string("hargs_tuple invalid vlan id"));
return false;
}
args.vlan.tuple[count++] = (uint16_t)vlan;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

overflow on evil socket message

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and not checking that there is at least one non-zero vlan

}
} else if (json_is_integer(hargs)) {
int vlan = json_integer_value(hargs);
if (vlan < 0 || vlan > 4094) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

0 should not be accepted, right ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"0" is a wildcard value

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But only for vlan_tuple, not for a single vlan, right ?

if (tenant_val.vlan.count == traffic_id.vlan.count) { \
match = true; \
for (int i = 0; i < tenant_val.vlan.count; i++) { \
if (tenant_val.vlan.tuple[i] != traffic_id.vlan.tuple[i]) { \
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this not use special case 0 ?

}

/* Match if the configured vlan match is a wildcard or the vlan ids match */
#define VLAN_TUPLE_MATCH(tenant_val, traffic_val) ((tenant_val == 0) || (tenant_val == traffic_val))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this macro used ?

Copy link
Contributor

@catenacyber catenacyber left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some overflows to avoid at least

@suricata-qa
Copy link

Information: QA ran without warnings.

Pipeline 16965

@jlucovsky
Copy link
Contributor Author

Closed for further evaluation.

@jlucovsky jlucovsky closed this Jun 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

4 participants