diff mbox

selinux: Add support for the SCTP portcon keyword

Message ID 20180311162255.27901-1-richard_c_haines@btinternet.com (mailing list archive)
State Not Applicable
Headers show

Commit Message

Jann Horn via Selinux March 11, 2018, 4:22 p.m. UTC
Update libsepol, checkpolicy and the CIL compiler to support the SCTP
portcon keyword.

Signed-off-by: Richard Haines <richard_c_haines@btinternet.com>
---
 checkpolicy/checkpolicy.c                      | 5 +++++
 checkpolicy/policy_define.c                    | 5 +++++
 libsepol/cil/src/cil.c                         | 1 +
 libsepol/cil/src/cil_binary.c                  | 6 ++++++
 libsepol/cil/src/cil_build_ast.c               | 2 ++
 libsepol/cil/src/cil_internal.h                | 4 +++-
 libsepol/cil/src/cil_policy.c                  | 2 ++
 libsepol/cil/src/cil_tree.c                    | 2 ++
 libsepol/include/sepol/port_record.h           | 1 +
 libsepol/src/kernel_to_cil.c                   | 4 ++++
 libsepol/src/kernel_to_common.c                | 3 +++
 libsepol/src/kernel_to_conf.c                  | 4 ++++
 libsepol/src/module_to_cil.c                   | 4 ++++
 libsepol/src/port_record.c                     | 2 ++
 libsepol/src/ports.c                           | 7 +++++++
 secilc/docs/cil_network_labeling_statements.md | 5 +++--
 secilc/test/policy.cil                         | 1 +
 17 files changed, 55 insertions(+), 3 deletions(-)

Comments

James Carter March 15, 2018, 5:09 p.m. UTC | #1
On 03/11/2018 12:22 PM, Richard Haines via Selinux wrote:
> Update libsepol, checkpolicy and the CIL compiler to support the SCTP
> portcon keyword.
> 
> Signed-off-by: Richard Haines <richard_c_haines@btinternet.com>

Acked-by: James Carter <jwcart2@tycho.nsa.gov>

> ---
>   checkpolicy/checkpolicy.c                      | 5 +++++
>   checkpolicy/policy_define.c                    | 5 +++++
>   libsepol/cil/src/cil.c                         | 1 +
>   libsepol/cil/src/cil_binary.c                  | 6 ++++++
>   libsepol/cil/src/cil_build_ast.c               | 2 ++
>   libsepol/cil/src/cil_internal.h                | 4 +++-
>   libsepol/cil/src/cil_policy.c                  | 2 ++
>   libsepol/cil/src/cil_tree.c                    | 2 ++
>   libsepol/include/sepol/port_record.h           | 1 +
>   libsepol/src/kernel_to_cil.c                   | 4 ++++
>   libsepol/src/kernel_to_common.c                | 3 +++
>   libsepol/src/kernel_to_conf.c                  | 4 ++++
>   libsepol/src/module_to_cil.c                   | 4 ++++
>   libsepol/src/port_record.c                     | 2 ++
>   libsepol/src/ports.c                           | 7 +++++++
>   secilc/docs/cil_network_labeling_statements.md | 5 +++--
>   secilc/test/policy.cil                         | 1 +
>   17 files changed, 55 insertions(+), 3 deletions(-)
> 
> diff --git a/checkpolicy/checkpolicy.c b/checkpolicy/checkpolicy.c
> index 923b47c1..fbda4558 100644
> --- a/checkpolicy/checkpolicy.c
> +++ b/checkpolicy/checkpolicy.c
> @@ -69,6 +69,9 @@
>   #ifndef IPPROTO_DCCP
>   #define IPPROTO_DCCP 33
>   #endif
> +#ifndef IPPROTO_SCTP
> +#define IPPROTO_SCTP 132
> +#endif
>   #include <arpa/inet.h>
>   #include <fcntl.h>
>   #include <stdio.h>
> @@ -944,6 +947,8 @@ int main(int argc, char **argv)
>   				protocol = IPPROTO_UDP;
>   			else if (!strcmp(ans, "dccp") || !strcmp(ans, "DCCP"))
>   				protocol = IPPROTO_DCCP;
> +			else if (!strcmp(ans, "sctp") || !strcmp(ans, "SCTP"))
> +				protocol = IPPROTO_SCTP;
>   			else {
>   				printf("unknown protocol\n");
>   				break;
> diff --git a/checkpolicy/policy_define.c b/checkpolicy/policy_define.c
> index 2c5db55d..11fd37d8 100644
> --- a/checkpolicy/policy_define.c
> +++ b/checkpolicy/policy_define.c
> @@ -40,6 +40,9 @@
>   #ifndef IPPROTO_DCCP
>   #define IPPROTO_DCCP 33
>   #endif
> +#ifndef IPPROTO_SCTP
> +#define IPPROTO_SCTP 132
> +#endif
>   #include <arpa/inet.h>
>   #include <stdlib.h>
>   #include <limits.h>
> @@ -5004,6 +5007,8 @@ int define_port_context(unsigned int low, unsigned int high)
>   		protocol = IPPROTO_UDP;
>   	} else if ((strcmp(id, "dccp") == 0) || (strcmp(id, "DCCP") == 0)) {
>   		protocol = IPPROTO_DCCP;
> +	} else if ((strcmp(id, "sctp") == 0) || (strcmp(id, "SCTP") == 0)) {
> +		protocol = IPPROTO_SCTP;
>   	} else {
>   		yyerror2("unrecognized protocol %s", id);
>   		goto bad;
> diff --git a/libsepol/cil/src/cil.c b/libsepol/cil/src/cil.c
> index 5a64c2bc..2a7ec063 100644
> --- a/libsepol/cil/src/cil.c
> +++ b/libsepol/cil/src/cil.c
> @@ -109,6 +109,7 @@ static void cil_init_keys(void)
>   	CIL_KEY_UDP = cil_strpool_add("udp");
>   	CIL_KEY_TCP = cil_strpool_add("tcp");
>   	CIL_KEY_DCCP = cil_strpool_add("dccp");
> +	CIL_KEY_SCTP = cil_strpool_add("sctp");
>   	CIL_KEY_AUDITALLOW = cil_strpool_add("auditallow");
>   	CIL_KEY_TUNABLEIF = cil_strpool_add("tunableif");
>   	CIL_KEY_ALLOW = cil_strpool_add("allow");
> diff --git a/libsepol/cil/src/cil_binary.c b/libsepol/cil/src/cil_binary.c
> index 431cd9cd..0cc6eeb1 100644
> --- a/libsepol/cil/src/cil_binary.c
> +++ b/libsepol/cil/src/cil_binary.c
> @@ -34,6 +34,9 @@
>   #ifndef IPPROTO_DCCP
>   #define IPPROTO_DCCP 33
>   #endif
> +#ifndef IPPROTO_SCTP
> +#define IPPROTO_SCTP 132
> +#endif
>   
>   #include <sepol/policydb/policydb.h>
>   #include <sepol/policydb/polcaps.h>
> @@ -3272,6 +3275,9 @@ int cil_portcon_to_policydb(policydb_t *pdb, struct cil_sort *portcons)
>   		case CIL_PROTOCOL_DCCP:
>   			new_ocon->u.port.protocol = IPPROTO_DCCP;
>   			break;
> +		case CIL_PROTOCOL_SCTP:
> +			new_ocon->u.port.protocol = IPPROTO_SCTP;
> +			break;
>   		default:
>   			/* should not get here */
>   			rc = SEPOL_ERR;
> diff --git a/libsepol/cil/src/cil_build_ast.c b/libsepol/cil/src/cil_build_ast.c
> index e84336bf..b90b0f60 100644
> --- a/libsepol/cil/src/cil_build_ast.c
> +++ b/libsepol/cil/src/cil_build_ast.c
> @@ -4405,6 +4405,8 @@ int cil_gen_portcon(struct cil_db *db, struct cil_tree_node *parse_current, stru
>   		portcon->proto = CIL_PROTOCOL_TCP;
>   	} else if (proto == CIL_KEY_DCCP) {
>   		portcon->proto = CIL_PROTOCOL_DCCP;
> +	} else if (proto == CIL_KEY_SCTP) {
> +		portcon->proto = CIL_PROTOCOL_SCTP;
>   	} else {
>   		cil_log(CIL_ERR, "Invalid protocol\n");
>   		rc = SEPOL_ERR;
> diff --git a/libsepol/cil/src/cil_internal.h b/libsepol/cil/src/cil_internal.h
> index 8393e391..6ff32285 100644
> --- a/libsepol/cil/src/cil_internal.h
> +++ b/libsepol/cil/src/cil_internal.h
> @@ -103,6 +103,7 @@ char *CIL_KEY_STAR;
>   char *CIL_KEY_TCP;
>   char *CIL_KEY_UDP;
>   char *CIL_KEY_DCCP;
> +char *CIL_KEY_SCTP;
>   char *CIL_KEY_AUDITALLOW;
>   char *CIL_KEY_TUNABLEIF;
>   char *CIL_KEY_ALLOW;
> @@ -740,7 +741,8 @@ struct cil_filecon {
>   enum cil_protocol {
>   	CIL_PROTOCOL_UDP = 1,
>   	CIL_PROTOCOL_TCP,
> -	CIL_PROTOCOL_DCCP
> +	CIL_PROTOCOL_DCCP,
> +	CIL_PROTOCOL_SCTP
>   };
>   
>   struct cil_ibpkeycon {
> diff --git a/libsepol/cil/src/cil_policy.c b/libsepol/cil/src/cil_policy.c
> index 99eb53c2..5edab5e0 100644
> --- a/libsepol/cil/src/cil_policy.c
> +++ b/libsepol/cil/src/cil_policy.c
> @@ -1757,6 +1757,8 @@ static void cil_portcons_to_policy(FILE *out, struct cil_sort *portcons, int mls
>   			fprintf(out, "tcp ");
>   		} else if (portcon->proto == CIL_PROTOCOL_DCCP) {
>   			fprintf(out, "dccp ");
> +		} else if (portcon->proto == CIL_PROTOCOL_SCTP) {
> +			fprintf(out, "sctp ");
>   		}
>   		if (portcon->port_low == portcon->port_high) {
>   			fprintf(out, "%d ", portcon->port_low);
> diff --git a/libsepol/cil/src/cil_tree.c b/libsepol/cil/src/cil_tree.c
> index b394a9d8..2abbb96c 100644
> --- a/libsepol/cil/src/cil_tree.c
> +++ b/libsepol/cil/src/cil_tree.c
> @@ -1436,6 +1436,8 @@ void cil_tree_print_node(struct cil_tree_node *node)
>   				cil_log(CIL_INFO, " tcp");
>   			} else if (portcon->proto == CIL_PROTOCOL_DCCP) {
>   				cil_log(CIL_INFO, " dccp");
> +			} else if (portcon->proto == CIL_PROTOCOL_SCTP) {
> +				cil_log(CIL_INFO, " sctp");
>   			}
>   			cil_log(CIL_INFO, " (%d %d)", portcon->port_low, portcon->port_high);
>   
> diff --git a/libsepol/include/sepol/port_record.h b/libsepol/include/sepol/port_record.h
> index df04ea09..77149cfa 100644
> --- a/libsepol/include/sepol/port_record.h
> +++ b/libsepol/include/sepol/port_record.h
> @@ -16,6 +16,7 @@ typedef struct sepol_port_key sepol_port_key_t;
>   #define SEPOL_PROTO_UDP 0
>   #define SEPOL_PROTO_TCP 1
>   #define SEPOL_PROTO_DCCP 2
> +#define SEPOL_PROTO_SCTP 3
>   
>   /* Key */
>   extern int sepol_port_compare(const sepol_port_t * port,
> diff --git a/libsepol/src/kernel_to_cil.c b/libsepol/src/kernel_to_cil.c
> index 0055c238..b1eb66d6 100644
> --- a/libsepol/src/kernel_to_cil.c
> +++ b/libsepol/src/kernel_to_cil.c
> @@ -12,6 +12,9 @@
>   #ifndef IPPROTO_DCCP
>   #define IPPROTO_DCCP 33
>   #endif
> +#ifndef IPPROTO_SCTP
> +#define IPPROTO_SCTP 132
> +#endif
>   
>   #include <sepol/policydb/avtab.h>
>   #include <sepol/policydb/conditional.h>
> @@ -2631,6 +2634,7 @@ static int write_selinux_port_rules_to_cil(FILE *out, struct policydb *pdb)
>   		case IPPROTO_TCP: protocol = "tcp"; break;
>   		case IPPROTO_UDP: protocol = "udp"; break;
>   		case IPPROTO_DCCP: protocol = "dccp"; break;
> +		case IPPROTO_SCTP: protocol = "sctp"; break;
>   		default:
>   			sepol_log_err("Unknown portcon protocol: %i", portcon->u.port.protocol);
>   			rc = -1;
> diff --git a/libsepol/src/kernel_to_common.c b/libsepol/src/kernel_to_common.c
> index 01ffc8fc..342bc3c9 100644
> --- a/libsepol/src/kernel_to_common.c
> +++ b/libsepol/src/kernel_to_common.c
> @@ -10,6 +10,9 @@
>   #ifndef IPPROTO_DCCP
>   #define IPPROTO_DCCP 33
>   #endif
> +#ifndef IPPROTO_SCTP
> +#define IPPROTO_SCTP 132
> +#endif
>   
>   #include <sepol/policydb/ebitmap.h>
>   #include <sepol/policydb/hashtab.h>
> diff --git a/libsepol/src/kernel_to_conf.c b/libsepol/src/kernel_to_conf.c
> index 95aa92fc..95405207 100644
> --- a/libsepol/src/kernel_to_conf.c
> +++ b/libsepol/src/kernel_to_conf.c
> @@ -11,6 +11,9 @@
>   #ifndef IPPROTO_DCCP
>   #define IPPROTO_DCCP 33
>   #endif
> +#ifndef IPPROTO_SCTP
> +#define IPPROTO_SCTP 132
> +#endif
>   
>   #include <sepol/policydb/avtab.h>
>   #include <sepol/policydb/conditional.h>
> @@ -2491,6 +2494,7 @@ static int write_selinux_port_rules_to_conf(FILE *out, struct policydb *pdb)
>   		case IPPROTO_TCP: protocol = "tcp"; break;
>   		case IPPROTO_UDP: protocol = "udp"; break;
>   		case IPPROTO_DCCP: protocol = "dccp"; break;
> +		case IPPROTO_SCTP: protocol = "sctp"; break;
>   		default:
>   			sepol_log_err("Unknown portcon protocol: %i", portcon->u.port.protocol);
>   			rc = -1;
> diff --git a/libsepol/src/module_to_cil.c b/libsepol/src/module_to_cil.c
> index 15b58a7a..5b8ed19e 100644
> --- a/libsepol/src/module_to_cil.c
> +++ b/libsepol/src/module_to_cil.c
> @@ -30,6 +30,9 @@
>   #ifndef IPPROTO_DCCP
>   #define IPPROTO_DCCP 33
>   #endif
> +#ifndef IPPROTO_SCTP
> +#define IPPROTO_SCTP 132
> +#endif
>   #include <signal.h>
>   #include <stdarg.h>
>   #include <stdio.h>
> @@ -2656,6 +2659,7 @@ static int ocontext_selinux_port_to_cil(struct policydb *pdb, struct ocontext *p
>   		case IPPROTO_TCP: protocol = "tcp"; break;
>   		case IPPROTO_UDP: protocol = "udp"; break;
>   		case IPPROTO_DCCP: protocol = "dccp"; break;
> +		case IPPROTO_SCTP: protocol = "sctp"; break;
>   		default:
>   			log_err("Unknown portcon protocol: %i", portcon->u.port.protocol);
>   			rc = -1;
> diff --git a/libsepol/src/port_record.c b/libsepol/src/port_record.c
> index ed9093bf..15fb198f 100644
> --- a/libsepol/src/port_record.c
> +++ b/libsepol/src/port_record.c
> @@ -186,6 +186,8 @@ const char *sepol_port_get_proto_str(int proto)
>   		return "tcp";
>   	case SEPOL_PROTO_DCCP:
>   		return "dccp";
> +	case SEPOL_PROTO_SCTP:
> +		return "sctp";
>   	default:
>   		return "???";
>   	}
> diff --git a/libsepol/src/ports.c b/libsepol/src/ports.c
> index 62ec6029..cc558632 100644
> --- a/libsepol/src/ports.c
> +++ b/libsepol/src/ports.c
> @@ -2,6 +2,9 @@
>   #ifndef IPPROTO_DCCP
>   #define IPPROTO_DCCP 33
>   #endif
> +#ifndef IPPROTO_SCTP
> +#define IPPROTO_SCTP 132
> +#endif
>   #include <stdlib.h>
>   
>   #include "debug.h"
> @@ -21,6 +24,8 @@ static inline int sepol2ipproto(sepol_handle_t * handle, int proto)
>   		return IPPROTO_UDP;
>   	case SEPOL_PROTO_DCCP:
>   		return IPPROTO_DCCP;
> +	case SEPOL_PROTO_SCTP:
> +		return IPPROTO_SCTP;
>   	default:
>   		ERR(handle, "unsupported protocol %u", proto);
>   		return STATUS_ERR;
> @@ -37,6 +42,8 @@ static inline int ipproto2sepol(sepol_handle_t * handle, int proto)
>   		return SEPOL_PROTO_UDP;
>   	case IPPROTO_DCCP:
>   		return SEPOL_PROTO_DCCP;
> +	case IPPROTO_SCTP:
> +		return SEPOL_PROTO_SCTP;
>   	default:
>   		ERR(handle, "invalid protocol %u " "found in policy", proto);
>   		return STATUS_ERR;
> diff --git a/secilc/docs/cil_network_labeling_statements.md b/secilc/docs/cil_network_labeling_statements.md
> index b06dbccc..49a836c1 100644
> --- a/secilc/docs/cil_network_labeling_statements.md
> +++ b/secilc/docs/cil_network_labeling_statements.md
> @@ -155,7 +155,7 @@ These examples show named and anonymous [`nodecon`](cil_network_labeling_stateme
>   portcon
>   -------
>   
> -Label a udp, tcp or dccp port.
> +Label a udp, tcp, dccp or sctp port.
>   
>   **Statement definition:**
>   
> @@ -175,7 +175,7 @@ Label a udp, tcp or dccp port.
>   </tr>
>   <tr class="even">
>   <td align="left"><p><code>protocol</code></p></td>
> -<td align="left"><p>The protocol keyword <code>tcp</code>, <code>udp</code> or <code>dccp</code>.</p></td>
> +<td align="left"><p>The protocol keyword <code>tcp</code>, <code>udp</code>, <code>dccp</code> or <code>sctp</code>.</p></td>
>   </tr>
>   <tr class="odd">
>   <td align="left"><p><code>port |</code></p>
> @@ -200,3 +200,4 @@ These examples show named and anonymous [`portcon`](cil_network_labeling_stateme
>       (portcon udp 4444 (unconfined.user object_r unconfined.object ((s0) level_2)))
>       (portcon tcp (2000 20000) (unconfined.user object_r unconfined.object (systemlow level_3)))
>       (portcon dccp (6840 6880) (unconfined.user object_r unconfined.object ((s0) level_2)))
> +    (portcon sctp (1024 1035) (unconfined.user object_r unconfined.object ((s0) level_2)))
> diff --git a/secilc/test/policy.cil b/secilc/test/policy.cil
> index 4c37ecca..02f4f88d 100644
> --- a/secilc/test/policy.cil
> +++ b/secilc/test/policy.cil
> @@ -271,6 +271,7 @@
>   	(portcon udp 25 system_u_bin_t_l2h)
>   	(portcon tcp 22 system_u_bin_t_l2h)
>   	(portcon dccp (2048 2096) system_u_bin_t_l2h)
> +	(portcon sctp (1024 1035) system_u_bin_t_l2h)
>   	(genfscon - "/usr/bin" system_u_bin_t_l2h)
>   	(netifcon eth0 system_u_bin_t_l2h system_u_bin_t_l2h) ;different contexts?
>   	(fsuse xattr ext3 system_u_bin_t_l2h)
>
James Carter March 19, 2018, 4:37 p.m. UTC | #2
On 03/15/2018 01:09 PM, jwcart2 wrote:
> On 03/11/2018 12:22 PM, Richard Haines via Selinux wrote:
>> Update libsepol, checkpolicy and the CIL compiler to support the SCTP
>> portcon keyword.
>>
>> Signed-off-by: Richard Haines <richard_c_haines@btinternet.com>
> 
> Acked-by: James Carter <jwcart2@tycho.nsa.gov>
> 

Applied.

Thanks,
Jim

>> ---
>>   checkpolicy/checkpolicy.c                      | 5 +++++
>>   checkpolicy/policy_define.c                    | 5 +++++
>>   libsepol/cil/src/cil.c                         | 1 +
>>   libsepol/cil/src/cil_binary.c                  | 6 ++++++
>>   libsepol/cil/src/cil_build_ast.c               | 2 ++
>>   libsepol/cil/src/cil_internal.h                | 4 +++-
>>   libsepol/cil/src/cil_policy.c                  | 2 ++
>>   libsepol/cil/src/cil_tree.c                    | 2 ++
>>   libsepol/include/sepol/port_record.h           | 1 +
>>   libsepol/src/kernel_to_cil.c                   | 4 ++++
>>   libsepol/src/kernel_to_common.c                | 3 +++
>>   libsepol/src/kernel_to_conf.c                  | 4 ++++
>>   libsepol/src/module_to_cil.c                   | 4 ++++
>>   libsepol/src/port_record.c                     | 2 ++
>>   libsepol/src/ports.c                           | 7 +++++++
>>   secilc/docs/cil_network_labeling_statements.md | 5 +++--
>>   secilc/test/policy.cil                         | 1 +
>>   17 files changed, 55 insertions(+), 3 deletions(-)
>>
>> diff --git a/checkpolicy/checkpolicy.c b/checkpolicy/checkpolicy.c
>> index 923b47c1..fbda4558 100644
>> --- a/checkpolicy/checkpolicy.c
>> +++ b/checkpolicy/checkpolicy.c
>> @@ -69,6 +69,9 @@
>>   #ifndef IPPROTO_DCCP
>>   #define IPPROTO_DCCP 33
>>   #endif
>> +#ifndef IPPROTO_SCTP
>> +#define IPPROTO_SCTP 132
>> +#endif
>>   #include <arpa/inet.h>
>>   #include <fcntl.h>
>>   #include <stdio.h>
>> @@ -944,6 +947,8 @@ int main(int argc, char **argv)
>>                   protocol = IPPROTO_UDP;
>>               else if (!strcmp(ans, "dccp") || !strcmp(ans, "DCCP"))
>>                   protocol = IPPROTO_DCCP;
>> +            else if (!strcmp(ans, "sctp") || !strcmp(ans, "SCTP"))
>> +                protocol = IPPROTO_SCTP;
>>               else {
>>                   printf("unknown protocol\n");
>>                   break;
>> diff --git a/checkpolicy/policy_define.c b/checkpolicy/policy_define.c
>> index 2c5db55d..11fd37d8 100644
>> --- a/checkpolicy/policy_define.c
>> +++ b/checkpolicy/policy_define.c
>> @@ -40,6 +40,9 @@
>>   #ifndef IPPROTO_DCCP
>>   #define IPPROTO_DCCP 33
>>   #endif
>> +#ifndef IPPROTO_SCTP
>> +#define IPPROTO_SCTP 132
>> +#endif
>>   #include <arpa/inet.h>
>>   #include <stdlib.h>
>>   #include <limits.h>
>> @@ -5004,6 +5007,8 @@ int define_port_context(unsigned int low, unsigned int 
>> high)
>>           protocol = IPPROTO_UDP;
>>       } else if ((strcmp(id, "dccp") == 0) || (strcmp(id, "DCCP") == 0)) {
>>           protocol = IPPROTO_DCCP;
>> +    } else if ((strcmp(id, "sctp") == 0) || (strcmp(id, "SCTP") == 0)) {
>> +        protocol = IPPROTO_SCTP;
>>       } else {
>>           yyerror2("unrecognized protocol %s", id);
>>           goto bad;
>> diff --git a/libsepol/cil/src/cil.c b/libsepol/cil/src/cil.c
>> index 5a64c2bc..2a7ec063 100644
>> --- a/libsepol/cil/src/cil.c
>> +++ b/libsepol/cil/src/cil.c
>> @@ -109,6 +109,7 @@ static void cil_init_keys(void)
>>       CIL_KEY_UDP = cil_strpool_add("udp");
>>       CIL_KEY_TCP = cil_strpool_add("tcp");
>>       CIL_KEY_DCCP = cil_strpool_add("dccp");
>> +    CIL_KEY_SCTP = cil_strpool_add("sctp");
>>       CIL_KEY_AUDITALLOW = cil_strpool_add("auditallow");
>>       CIL_KEY_TUNABLEIF = cil_strpool_add("tunableif");
>>       CIL_KEY_ALLOW = cil_strpool_add("allow");
>> diff --git a/libsepol/cil/src/cil_binary.c b/libsepol/cil/src/cil_binary.c
>> index 431cd9cd..0cc6eeb1 100644
>> --- a/libsepol/cil/src/cil_binary.c
>> +++ b/libsepol/cil/src/cil_binary.c
>> @@ -34,6 +34,9 @@
>>   #ifndef IPPROTO_DCCP
>>   #define IPPROTO_DCCP 33
>>   #endif
>> +#ifndef IPPROTO_SCTP
>> +#define IPPROTO_SCTP 132
>> +#endif
>>   #include <sepol/policydb/policydb.h>
>>   #include <sepol/policydb/polcaps.h>
>> @@ -3272,6 +3275,9 @@ int cil_portcon_to_policydb(policydb_t *pdb, struct 
>> cil_sort *portcons)
>>           case CIL_PROTOCOL_DCCP:
>>               new_ocon->u.port.protocol = IPPROTO_DCCP;
>>               break;
>> +        case CIL_PROTOCOL_SCTP:
>> +            new_ocon->u.port.protocol = IPPROTO_SCTP;
>> +            break;
>>           default:
>>               /* should not get here */
>>               rc = SEPOL_ERR;
>> diff --git a/libsepol/cil/src/cil_build_ast.c b/libsepol/cil/src/cil_build_ast.c
>> index e84336bf..b90b0f60 100644
>> --- a/libsepol/cil/src/cil_build_ast.c
>> +++ b/libsepol/cil/src/cil_build_ast.c
>> @@ -4405,6 +4405,8 @@ int cil_gen_portcon(struct cil_db *db, struct 
>> cil_tree_node *parse_current, stru
>>           portcon->proto = CIL_PROTOCOL_TCP;
>>       } else if (proto == CIL_KEY_DCCP) {
>>           portcon->proto = CIL_PROTOCOL_DCCP;
>> +    } else if (proto == CIL_KEY_SCTP) {
>> +        portcon->proto = CIL_PROTOCOL_SCTP;
>>       } else {
>>           cil_log(CIL_ERR, "Invalid protocol\n");
>>           rc = SEPOL_ERR;
>> diff --git a/libsepol/cil/src/cil_internal.h b/libsepol/cil/src/cil_internal.h
>> index 8393e391..6ff32285 100644
>> --- a/libsepol/cil/src/cil_internal.h
>> +++ b/libsepol/cil/src/cil_internal.h
>> @@ -103,6 +103,7 @@ char *CIL_KEY_STAR;
>>   char *CIL_KEY_TCP;
>>   char *CIL_KEY_UDP;
>>   char *CIL_KEY_DCCP;
>> +char *CIL_KEY_SCTP;
>>   char *CIL_KEY_AUDITALLOW;
>>   char *CIL_KEY_TUNABLEIF;
>>   char *CIL_KEY_ALLOW;
>> @@ -740,7 +741,8 @@ struct cil_filecon {
>>   enum cil_protocol {
>>       CIL_PROTOCOL_UDP = 1,
>>       CIL_PROTOCOL_TCP,
>> -    CIL_PROTOCOL_DCCP
>> +    CIL_PROTOCOL_DCCP,
>> +    CIL_PROTOCOL_SCTP
>>   };
>>   struct cil_ibpkeycon {
>> diff --git a/libsepol/cil/src/cil_policy.c b/libsepol/cil/src/cil_policy.c
>> index 99eb53c2..5edab5e0 100644
>> --- a/libsepol/cil/src/cil_policy.c
>> +++ b/libsepol/cil/src/cil_policy.c
>> @@ -1757,6 +1757,8 @@ static void cil_portcons_to_policy(FILE *out, struct 
>> cil_sort *portcons, int mls
>>               fprintf(out, "tcp ");
>>           } else if (portcon->proto == CIL_PROTOCOL_DCCP) {
>>               fprintf(out, "dccp ");
>> +        } else if (portcon->proto == CIL_PROTOCOL_SCTP) {
>> +            fprintf(out, "sctp ");
>>           }
>>           if (portcon->port_low == portcon->port_high) {
>>               fprintf(out, "%d ", portcon->port_low);
>> diff --git a/libsepol/cil/src/cil_tree.c b/libsepol/cil/src/cil_tree.c
>> index b394a9d8..2abbb96c 100644
>> --- a/libsepol/cil/src/cil_tree.c
>> +++ b/libsepol/cil/src/cil_tree.c
>> @@ -1436,6 +1436,8 @@ void cil_tree_print_node(struct cil_tree_node *node)
>>                   cil_log(CIL_INFO, " tcp");
>>               } else if (portcon->proto == CIL_PROTOCOL_DCCP) {
>>                   cil_log(CIL_INFO, " dccp");
>> +            } else if (portcon->proto == CIL_PROTOCOL_SCTP) {
>> +                cil_log(CIL_INFO, " sctp");
>>               }
>>               cil_log(CIL_INFO, " (%d %d)", portcon->port_low, 
>> portcon->port_high);
>> diff --git a/libsepol/include/sepol/port_record.h 
>> b/libsepol/include/sepol/port_record.h
>> index df04ea09..77149cfa 100644
>> --- a/libsepol/include/sepol/port_record.h
>> +++ b/libsepol/include/sepol/port_record.h
>> @@ -16,6 +16,7 @@ typedef struct sepol_port_key sepol_port_key_t;
>>   #define SEPOL_PROTO_UDP 0
>>   #define SEPOL_PROTO_TCP 1
>>   #define SEPOL_PROTO_DCCP 2
>> +#define SEPOL_PROTO_SCTP 3
>>   /* Key */
>>   extern int sepol_port_compare(const sepol_port_t * port,
>> diff --git a/libsepol/src/kernel_to_cil.c b/libsepol/src/kernel_to_cil.c
>> index 0055c238..b1eb66d6 100644
>> --- a/libsepol/src/kernel_to_cil.c
>> +++ b/libsepol/src/kernel_to_cil.c
>> @@ -12,6 +12,9 @@
>>   #ifndef IPPROTO_DCCP
>>   #define IPPROTO_DCCP 33
>>   #endif
>> +#ifndef IPPROTO_SCTP
>> +#define IPPROTO_SCTP 132
>> +#endif
>>   #include <sepol/policydb/avtab.h>
>>   #include <sepol/policydb/conditional.h>
>> @@ -2631,6 +2634,7 @@ static int write_selinux_port_rules_to_cil(FILE *out, 
>> struct policydb *pdb)
>>           case IPPROTO_TCP: protocol = "tcp"; break;
>>           case IPPROTO_UDP: protocol = "udp"; break;
>>           case IPPROTO_DCCP: protocol = "dccp"; break;
>> +        case IPPROTO_SCTP: protocol = "sctp"; break;
>>           default:
>>               sepol_log_err("Unknown portcon protocol: %i", 
>> portcon->u.port.protocol);
>>               rc = -1;
>> diff --git a/libsepol/src/kernel_to_common.c b/libsepol/src/kernel_to_common.c
>> index 01ffc8fc..342bc3c9 100644
>> --- a/libsepol/src/kernel_to_common.c
>> +++ b/libsepol/src/kernel_to_common.c
>> @@ -10,6 +10,9 @@
>>   #ifndef IPPROTO_DCCP
>>   #define IPPROTO_DCCP 33
>>   #endif
>> +#ifndef IPPROTO_SCTP
>> +#define IPPROTO_SCTP 132
>> +#endif
>>   #include <sepol/policydb/ebitmap.h>
>>   #include <sepol/policydb/hashtab.h>
>> diff --git a/libsepol/src/kernel_to_conf.c b/libsepol/src/kernel_to_conf.c
>> index 95aa92fc..95405207 100644
>> --- a/libsepol/src/kernel_to_conf.c
>> +++ b/libsepol/src/kernel_to_conf.c
>> @@ -11,6 +11,9 @@
>>   #ifndef IPPROTO_DCCP
>>   #define IPPROTO_DCCP 33
>>   #endif
>> +#ifndef IPPROTO_SCTP
>> +#define IPPROTO_SCTP 132
>> +#endif
>>   #include <sepol/policydb/avtab.h>
>>   #include <sepol/policydb/conditional.h>
>> @@ -2491,6 +2494,7 @@ static int write_selinux_port_rules_to_conf(FILE *out, 
>> struct policydb *pdb)
>>           case IPPROTO_TCP: protocol = "tcp"; break;
>>           case IPPROTO_UDP: protocol = "udp"; break;
>>           case IPPROTO_DCCP: protocol = "dccp"; break;
>> +        case IPPROTO_SCTP: protocol = "sctp"; break;
>>           default:
>>               sepol_log_err("Unknown portcon protocol: %i", 
>> portcon->u.port.protocol);
>>               rc = -1;
>> diff --git a/libsepol/src/module_to_cil.c b/libsepol/src/module_to_cil.c
>> index 15b58a7a..5b8ed19e 100644
>> --- a/libsepol/src/module_to_cil.c
>> +++ b/libsepol/src/module_to_cil.c
>> @@ -30,6 +30,9 @@
>>   #ifndef IPPROTO_DCCP
>>   #define IPPROTO_DCCP 33
>>   #endif
>> +#ifndef IPPROTO_SCTP
>> +#define IPPROTO_SCTP 132
>> +#endif
>>   #include <signal.h>
>>   #include <stdarg.h>
>>   #include <stdio.h>
>> @@ -2656,6 +2659,7 @@ static int ocontext_selinux_port_to_cil(struct policydb 
>> *pdb, struct ocontext *p
>>           case IPPROTO_TCP: protocol = "tcp"; break;
>>           case IPPROTO_UDP: protocol = "udp"; break;
>>           case IPPROTO_DCCP: protocol = "dccp"; break;
>> +        case IPPROTO_SCTP: protocol = "sctp"; break;
>>           default:
>>               log_err("Unknown portcon protocol: %i", portcon->u.port.protocol);
>>               rc = -1;
>> diff --git a/libsepol/src/port_record.c b/libsepol/src/port_record.c
>> index ed9093bf..15fb198f 100644
>> --- a/libsepol/src/port_record.c
>> +++ b/libsepol/src/port_record.c
>> @@ -186,6 +186,8 @@ const char *sepol_port_get_proto_str(int proto)
>>           return "tcp";
>>       case SEPOL_PROTO_DCCP:
>>           return "dccp";
>> +    case SEPOL_PROTO_SCTP:
>> +        return "sctp";
>>       default:
>>           return "???";
>>       }
>> diff --git a/libsepol/src/ports.c b/libsepol/src/ports.c
>> index 62ec6029..cc558632 100644
>> --- a/libsepol/src/ports.c
>> +++ b/libsepol/src/ports.c
>> @@ -2,6 +2,9 @@
>>   #ifndef IPPROTO_DCCP
>>   #define IPPROTO_DCCP 33
>>   #endif
>> +#ifndef IPPROTO_SCTP
>> +#define IPPROTO_SCTP 132
>> +#endif
>>   #include <stdlib.h>
>>   #include "debug.h"
>> @@ -21,6 +24,8 @@ static inline int sepol2ipproto(sepol_handle_t * handle, int 
>> proto)
>>           return IPPROTO_UDP;
>>       case SEPOL_PROTO_DCCP:
>>           return IPPROTO_DCCP;
>> +    case SEPOL_PROTO_SCTP:
>> +        return IPPROTO_SCTP;
>>       default:
>>           ERR(handle, "unsupported protocol %u", proto);
>>           return STATUS_ERR;
>> @@ -37,6 +42,8 @@ static inline int ipproto2sepol(sepol_handle_t * handle, int 
>> proto)
>>           return SEPOL_PROTO_UDP;
>>       case IPPROTO_DCCP:
>>           return SEPOL_PROTO_DCCP;
>> +    case IPPROTO_SCTP:
>> +        return SEPOL_PROTO_SCTP;
>>       default:
>>           ERR(handle, "invalid protocol %u " "found in policy", proto);
>>           return STATUS_ERR;
>> diff --git a/secilc/docs/cil_network_labeling_statements.md 
>> b/secilc/docs/cil_network_labeling_statements.md
>> index b06dbccc..49a836c1 100644
>> --- a/secilc/docs/cil_network_labeling_statements.md
>> +++ b/secilc/docs/cil_network_labeling_statements.md
>> @@ -155,7 +155,7 @@ These examples show named and anonymous 
>> [`nodecon`](cil_network_labeling_stateme
>>   portcon
>>   -------
>> -Label a udp, tcp or dccp port.
>> +Label a udp, tcp, dccp or sctp port.
>>   **Statement definition:**
>> @@ -175,7 +175,7 @@ Label a udp, tcp or dccp port.
>>   </tr>
>>   <tr class="even">
>>   <td align="left"><p><code>protocol</code></p></td>
>> -<td align="left"><p>The protocol keyword <code>tcp</code>, <code>udp</code> 
>> or <code>dccp</code>.</p></td>
>> +<td align="left"><p>The protocol keyword <code>tcp</code>, <code>udp</code>, 
>> <code>dccp</code> or <code>sctp</code>.</p></td>
>>   </tr>
>>   <tr class="odd">
>>   <td align="left"><p><code>port |</code></p>
>> @@ -200,3 +200,4 @@ These examples show named and anonymous 
>> [`portcon`](cil_network_labeling_stateme
>>       (portcon udp 4444 (unconfined.user object_r unconfined.object ((s0) 
>> level_2)))
>>       (portcon tcp (2000 20000) (unconfined.user object_r unconfined.object 
>> (systemlow level_3)))
>>       (portcon dccp (6840 6880) (unconfined.user object_r unconfined.object 
>> ((s0) level_2)))
>> +    (portcon sctp (1024 1035) (unconfined.user object_r unconfined.object 
>> ((s0) level_2)))
>> diff --git a/secilc/test/policy.cil b/secilc/test/policy.cil
>> index 4c37ecca..02f4f88d 100644
>> --- a/secilc/test/policy.cil
>> +++ b/secilc/test/policy.cil
>> @@ -271,6 +271,7 @@
>>       (portcon udp 25 system_u_bin_t_l2h)
>>       (portcon tcp 22 system_u_bin_t_l2h)
>>       (portcon dccp (2048 2096) system_u_bin_t_l2h)
>> +    (portcon sctp (1024 1035) system_u_bin_t_l2h)
>>       (genfscon - "/usr/bin" system_u_bin_t_l2h)
>>       (netifcon eth0 system_u_bin_t_l2h system_u_bin_t_l2h) ;different contexts?
>>       (fsuse xattr ext3 system_u_bin_t_l2h)
>>
> 
>
diff mbox

Patch

diff --git a/checkpolicy/checkpolicy.c b/checkpolicy/checkpolicy.c
index 923b47c1..fbda4558 100644
--- a/checkpolicy/checkpolicy.c
+++ b/checkpolicy/checkpolicy.c
@@ -69,6 +69,9 @@ 
 #ifndef IPPROTO_DCCP
 #define IPPROTO_DCCP 33
 #endif
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
 #include <arpa/inet.h>
 #include <fcntl.h>
 #include <stdio.h>
@@ -944,6 +947,8 @@  int main(int argc, char **argv)
 				protocol = IPPROTO_UDP;
 			else if (!strcmp(ans, "dccp") || !strcmp(ans, "DCCP"))
 				protocol = IPPROTO_DCCP;
+			else if (!strcmp(ans, "sctp") || !strcmp(ans, "SCTP"))
+				protocol = IPPROTO_SCTP;
 			else {
 				printf("unknown protocol\n");
 				break;
diff --git a/checkpolicy/policy_define.c b/checkpolicy/policy_define.c
index 2c5db55d..11fd37d8 100644
--- a/checkpolicy/policy_define.c
+++ b/checkpolicy/policy_define.c
@@ -40,6 +40,9 @@ 
 #ifndef IPPROTO_DCCP
 #define IPPROTO_DCCP 33
 #endif
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
 #include <arpa/inet.h>
 #include <stdlib.h>
 #include <limits.h>
@@ -5004,6 +5007,8 @@  int define_port_context(unsigned int low, unsigned int high)
 		protocol = IPPROTO_UDP;
 	} else if ((strcmp(id, "dccp") == 0) || (strcmp(id, "DCCP") == 0)) {
 		protocol = IPPROTO_DCCP;
+	} else if ((strcmp(id, "sctp") == 0) || (strcmp(id, "SCTP") == 0)) {
+		protocol = IPPROTO_SCTP;
 	} else {
 		yyerror2("unrecognized protocol %s", id);
 		goto bad;
diff --git a/libsepol/cil/src/cil.c b/libsepol/cil/src/cil.c
index 5a64c2bc..2a7ec063 100644
--- a/libsepol/cil/src/cil.c
+++ b/libsepol/cil/src/cil.c
@@ -109,6 +109,7 @@  static void cil_init_keys(void)
 	CIL_KEY_UDP = cil_strpool_add("udp");
 	CIL_KEY_TCP = cil_strpool_add("tcp");
 	CIL_KEY_DCCP = cil_strpool_add("dccp");
+	CIL_KEY_SCTP = cil_strpool_add("sctp");
 	CIL_KEY_AUDITALLOW = cil_strpool_add("auditallow");
 	CIL_KEY_TUNABLEIF = cil_strpool_add("tunableif");
 	CIL_KEY_ALLOW = cil_strpool_add("allow");
diff --git a/libsepol/cil/src/cil_binary.c b/libsepol/cil/src/cil_binary.c
index 431cd9cd..0cc6eeb1 100644
--- a/libsepol/cil/src/cil_binary.c
+++ b/libsepol/cil/src/cil_binary.c
@@ -34,6 +34,9 @@ 
 #ifndef IPPROTO_DCCP
 #define IPPROTO_DCCP 33
 #endif
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
 
 #include <sepol/policydb/policydb.h>
 #include <sepol/policydb/polcaps.h>
@@ -3272,6 +3275,9 @@  int cil_portcon_to_policydb(policydb_t *pdb, struct cil_sort *portcons)
 		case CIL_PROTOCOL_DCCP:
 			new_ocon->u.port.protocol = IPPROTO_DCCP;
 			break;
+		case CIL_PROTOCOL_SCTP:
+			new_ocon->u.port.protocol = IPPROTO_SCTP;
+			break;
 		default:
 			/* should not get here */
 			rc = SEPOL_ERR;
diff --git a/libsepol/cil/src/cil_build_ast.c b/libsepol/cil/src/cil_build_ast.c
index e84336bf..b90b0f60 100644
--- a/libsepol/cil/src/cil_build_ast.c
+++ b/libsepol/cil/src/cil_build_ast.c
@@ -4405,6 +4405,8 @@  int cil_gen_portcon(struct cil_db *db, struct cil_tree_node *parse_current, stru
 		portcon->proto = CIL_PROTOCOL_TCP;
 	} else if (proto == CIL_KEY_DCCP) {
 		portcon->proto = CIL_PROTOCOL_DCCP;
+	} else if (proto == CIL_KEY_SCTP) {
+		portcon->proto = CIL_PROTOCOL_SCTP;
 	} else {
 		cil_log(CIL_ERR, "Invalid protocol\n");
 		rc = SEPOL_ERR;
diff --git a/libsepol/cil/src/cil_internal.h b/libsepol/cil/src/cil_internal.h
index 8393e391..6ff32285 100644
--- a/libsepol/cil/src/cil_internal.h
+++ b/libsepol/cil/src/cil_internal.h
@@ -103,6 +103,7 @@  char *CIL_KEY_STAR;
 char *CIL_KEY_TCP;
 char *CIL_KEY_UDP;
 char *CIL_KEY_DCCP;
+char *CIL_KEY_SCTP;
 char *CIL_KEY_AUDITALLOW;
 char *CIL_KEY_TUNABLEIF;
 char *CIL_KEY_ALLOW;
@@ -740,7 +741,8 @@  struct cil_filecon {
 enum cil_protocol {
 	CIL_PROTOCOL_UDP = 1,
 	CIL_PROTOCOL_TCP,
-	CIL_PROTOCOL_DCCP
+	CIL_PROTOCOL_DCCP,
+	CIL_PROTOCOL_SCTP
 };
 
 struct cil_ibpkeycon {
diff --git a/libsepol/cil/src/cil_policy.c b/libsepol/cil/src/cil_policy.c
index 99eb53c2..5edab5e0 100644
--- a/libsepol/cil/src/cil_policy.c
+++ b/libsepol/cil/src/cil_policy.c
@@ -1757,6 +1757,8 @@  static void cil_portcons_to_policy(FILE *out, struct cil_sort *portcons, int mls
 			fprintf(out, "tcp ");
 		} else if (portcon->proto == CIL_PROTOCOL_DCCP) {
 			fprintf(out, "dccp ");
+		} else if (portcon->proto == CIL_PROTOCOL_SCTP) {
+			fprintf(out, "sctp ");
 		}
 		if (portcon->port_low == portcon->port_high) {
 			fprintf(out, "%d ", portcon->port_low);
diff --git a/libsepol/cil/src/cil_tree.c b/libsepol/cil/src/cil_tree.c
index b394a9d8..2abbb96c 100644
--- a/libsepol/cil/src/cil_tree.c
+++ b/libsepol/cil/src/cil_tree.c
@@ -1436,6 +1436,8 @@  void cil_tree_print_node(struct cil_tree_node *node)
 				cil_log(CIL_INFO, " tcp");
 			} else if (portcon->proto == CIL_PROTOCOL_DCCP) {
 				cil_log(CIL_INFO, " dccp");
+			} else if (portcon->proto == CIL_PROTOCOL_SCTP) {
+				cil_log(CIL_INFO, " sctp");
 			}
 			cil_log(CIL_INFO, " (%d %d)", portcon->port_low, portcon->port_high);
 
diff --git a/libsepol/include/sepol/port_record.h b/libsepol/include/sepol/port_record.h
index df04ea09..77149cfa 100644
--- a/libsepol/include/sepol/port_record.h
+++ b/libsepol/include/sepol/port_record.h
@@ -16,6 +16,7 @@  typedef struct sepol_port_key sepol_port_key_t;
 #define SEPOL_PROTO_UDP 0
 #define SEPOL_PROTO_TCP 1
 #define SEPOL_PROTO_DCCP 2
+#define SEPOL_PROTO_SCTP 3
 
 /* Key */
 extern int sepol_port_compare(const sepol_port_t * port,
diff --git a/libsepol/src/kernel_to_cil.c b/libsepol/src/kernel_to_cil.c
index 0055c238..b1eb66d6 100644
--- a/libsepol/src/kernel_to_cil.c
+++ b/libsepol/src/kernel_to_cil.c
@@ -12,6 +12,9 @@ 
 #ifndef IPPROTO_DCCP
 #define IPPROTO_DCCP 33
 #endif
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
 
 #include <sepol/policydb/avtab.h>
 #include <sepol/policydb/conditional.h>
@@ -2631,6 +2634,7 @@  static int write_selinux_port_rules_to_cil(FILE *out, struct policydb *pdb)
 		case IPPROTO_TCP: protocol = "tcp"; break;
 		case IPPROTO_UDP: protocol = "udp"; break;
 		case IPPROTO_DCCP: protocol = "dccp"; break;
+		case IPPROTO_SCTP: protocol = "sctp"; break;
 		default:
 			sepol_log_err("Unknown portcon protocol: %i", portcon->u.port.protocol);
 			rc = -1;
diff --git a/libsepol/src/kernel_to_common.c b/libsepol/src/kernel_to_common.c
index 01ffc8fc..342bc3c9 100644
--- a/libsepol/src/kernel_to_common.c
+++ b/libsepol/src/kernel_to_common.c
@@ -10,6 +10,9 @@ 
 #ifndef IPPROTO_DCCP
 #define IPPROTO_DCCP 33
 #endif
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
 
 #include <sepol/policydb/ebitmap.h>
 #include <sepol/policydb/hashtab.h>
diff --git a/libsepol/src/kernel_to_conf.c b/libsepol/src/kernel_to_conf.c
index 95aa92fc..95405207 100644
--- a/libsepol/src/kernel_to_conf.c
+++ b/libsepol/src/kernel_to_conf.c
@@ -11,6 +11,9 @@ 
 #ifndef IPPROTO_DCCP
 #define IPPROTO_DCCP 33
 #endif
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
 
 #include <sepol/policydb/avtab.h>
 #include <sepol/policydb/conditional.h>
@@ -2491,6 +2494,7 @@  static int write_selinux_port_rules_to_conf(FILE *out, struct policydb *pdb)
 		case IPPROTO_TCP: protocol = "tcp"; break;
 		case IPPROTO_UDP: protocol = "udp"; break;
 		case IPPROTO_DCCP: protocol = "dccp"; break;
+		case IPPROTO_SCTP: protocol = "sctp"; break;
 		default:
 			sepol_log_err("Unknown portcon protocol: %i", portcon->u.port.protocol);
 			rc = -1;
diff --git a/libsepol/src/module_to_cil.c b/libsepol/src/module_to_cil.c
index 15b58a7a..5b8ed19e 100644
--- a/libsepol/src/module_to_cil.c
+++ b/libsepol/src/module_to_cil.c
@@ -30,6 +30,9 @@ 
 #ifndef IPPROTO_DCCP
 #define IPPROTO_DCCP 33
 #endif
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
 #include <signal.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -2656,6 +2659,7 @@  static int ocontext_selinux_port_to_cil(struct policydb *pdb, struct ocontext *p
 		case IPPROTO_TCP: protocol = "tcp"; break;
 		case IPPROTO_UDP: protocol = "udp"; break;
 		case IPPROTO_DCCP: protocol = "dccp"; break;
+		case IPPROTO_SCTP: protocol = "sctp"; break;
 		default:
 			log_err("Unknown portcon protocol: %i", portcon->u.port.protocol);
 			rc = -1;
diff --git a/libsepol/src/port_record.c b/libsepol/src/port_record.c
index ed9093bf..15fb198f 100644
--- a/libsepol/src/port_record.c
+++ b/libsepol/src/port_record.c
@@ -186,6 +186,8 @@  const char *sepol_port_get_proto_str(int proto)
 		return "tcp";
 	case SEPOL_PROTO_DCCP:
 		return "dccp";
+	case SEPOL_PROTO_SCTP:
+		return "sctp";
 	default:
 		return "???";
 	}
diff --git a/libsepol/src/ports.c b/libsepol/src/ports.c
index 62ec6029..cc558632 100644
--- a/libsepol/src/ports.c
+++ b/libsepol/src/ports.c
@@ -2,6 +2,9 @@ 
 #ifndef IPPROTO_DCCP
 #define IPPROTO_DCCP 33
 #endif
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
 #include <stdlib.h>
 
 #include "debug.h"
@@ -21,6 +24,8 @@  static inline int sepol2ipproto(sepol_handle_t * handle, int proto)
 		return IPPROTO_UDP;
 	case SEPOL_PROTO_DCCP:
 		return IPPROTO_DCCP;
+	case SEPOL_PROTO_SCTP:
+		return IPPROTO_SCTP;
 	default:
 		ERR(handle, "unsupported protocol %u", proto);
 		return STATUS_ERR;
@@ -37,6 +42,8 @@  static inline int ipproto2sepol(sepol_handle_t * handle, int proto)
 		return SEPOL_PROTO_UDP;
 	case IPPROTO_DCCP:
 		return SEPOL_PROTO_DCCP;
+	case IPPROTO_SCTP:
+		return SEPOL_PROTO_SCTP;
 	default:
 		ERR(handle, "invalid protocol %u " "found in policy", proto);
 		return STATUS_ERR;
diff --git a/secilc/docs/cil_network_labeling_statements.md b/secilc/docs/cil_network_labeling_statements.md
index b06dbccc..49a836c1 100644
--- a/secilc/docs/cil_network_labeling_statements.md
+++ b/secilc/docs/cil_network_labeling_statements.md
@@ -155,7 +155,7 @@  These examples show named and anonymous [`nodecon`](cil_network_labeling_stateme
 portcon
 -------
 
-Label a udp, tcp or dccp port.
+Label a udp, tcp, dccp or sctp port.
 
 **Statement definition:**
 
@@ -175,7 +175,7 @@  Label a udp, tcp or dccp port.
 </tr>
 <tr class="even">
 <td align="left"><p><code>protocol</code></p></td>
-<td align="left"><p>The protocol keyword <code>tcp</code>, <code>udp</code> or <code>dccp</code>.</p></td>
+<td align="left"><p>The protocol keyword <code>tcp</code>, <code>udp</code>, <code>dccp</code> or <code>sctp</code>.</p></td>
 </tr>
 <tr class="odd">
 <td align="left"><p><code>port |</code></p>
@@ -200,3 +200,4 @@  These examples show named and anonymous [`portcon`](cil_network_labeling_stateme
     (portcon udp 4444 (unconfined.user object_r unconfined.object ((s0) level_2)))
     (portcon tcp (2000 20000) (unconfined.user object_r unconfined.object (systemlow level_3)))
     (portcon dccp (6840 6880) (unconfined.user object_r unconfined.object ((s0) level_2)))
+    (portcon sctp (1024 1035) (unconfined.user object_r unconfined.object ((s0) level_2)))
diff --git a/secilc/test/policy.cil b/secilc/test/policy.cil
index 4c37ecca..02f4f88d 100644
--- a/secilc/test/policy.cil
+++ b/secilc/test/policy.cil
@@ -271,6 +271,7 @@ 
 	(portcon udp 25 system_u_bin_t_l2h)
 	(portcon tcp 22 system_u_bin_t_l2h)
 	(portcon dccp (2048 2096) system_u_bin_t_l2h)
+	(portcon sctp (1024 1035) system_u_bin_t_l2h)
 	(genfscon - "/usr/bin" system_u_bin_t_l2h)
 	(netifcon eth0 system_u_bin_t_l2h system_u_bin_t_l2h) ;different contexts?
 	(fsuse xattr ext3 system_u_bin_t_l2h)