kernel support for new range_transition statements
PATCH 1/2 kernel support for new range_transition statements
This patch introduces support for policy version 21. This version of the binary kernel policy allows for defining range transitions on security classes other than the process security class. As always, backwards compatibility for older formats is retained. The security class is read in as specified when using the new format, while the "process" security class is assumed when using an older policy format.
include/security.h | 3 ++- ss/mls.c | 21 ++++++++++----------- ss/policydb.c | 27 ++++++++++++++++++++------- ss/policydb.h | 7 ++++--- 4 files changed, 36 insertions(+), 22 deletions(-)
security/selinux/include/security.h +0 -0
@@ -24,10 +24,11 @@ #define POLICYDB_VERSION_NLCLASS 18
#define POLICYDB_VERSION_VALIDATETRANS 19
#define POLICYDB_VERSION_MLS 19
#define POLICYDB_VERSION_AVTAB 20
+#define POLICYDB_VERSION_RANGETRANS 21
/* Range of policy versions we understand*/
#define POLICYDB_VERSION_MIN POLICYDB_VERSION_BASE
-#define POLICYDB_VERSION_MAX POLICYDB_VERSION_AVTAB
+#define POLICYDB_VERSION_MAX POLICYDB_VERSION_RANGETRANS
extern int selinux_enabled;
extern int selinux_mls_enabled;
security/selinux/ss/mls.c +0 -0
@@ -543,22 +543,21 @@ int mls_compute_sid(struct context *scon
u32 specified,
struct context *newcontext)
{
+ struct range_trans *rtr;
+
if (!selinux_mls_enabled)
return 0;
switch (specified) {
case AVTAB_TRANSITION:- if (tclass == SECCLASS_PROCESS) {
- struct range_trans *rangetr;
- /* Look for a range transition rule. */
- for (rangetr = policydb.range_tr; rangetr;
- rangetr = rangetr->next) {
- if (rangetr->dom == scontext->type &&
- rangetr->type == tcontext->type) {
- /* Set the range from the rule */
- return mls_range_set(newcontext,
- &rangetr->range);
- }
+ /* Look for a range transition rule. */
+ for (rtr = policydb.range_tr; rtr; rtr = rtr->next) {
+ if (rtr->source_type == scontext->type &&
+ rtr->target_type == tcontext->type &&
+ rtr->target_class == tclass) {
+ /* Set the range from the rule */
+ return mls_range_set(newcontext,
+ &rtr->target_range); } } /* Fallthrough */
security/selinux/ss/policydb.c +0 -0
@@ -96,6 +96,11 @@ static struct policydb_compat_info polic
.sym_num = SYM_NUM,
.ocon_num = OCON_NUM,
},
+ {
+ .version = POLICYDB_VERSION_RANGETRANS, + .sym_num = SYM_NUM, + .ocon_num = OCON_NUM,
+ },
};
static struct policydb_compat_info *policydb_lookup_compat(int version) @@ -645,15 +650,15 @@ void policydb_destroy(struct policydb *p
for (rt = p->range_tr; rt; rt = rt -> next) {
if (lrt) {
- ebitmap_destroy(&lrt->range.level[0].cat);
- ebitmap_destroy(&lrt->range.level[1].cat);
+ ebitmap_destroy(&lrt->target_range.level[0].cat);
+ ebitmap_destroy(&lrt->target_range.level[1].cat);
kfree(lrt);
}
lrt = rt;
}
if (lrt) {
- ebitmap_destroy(&lrt->range.level[0].cat);
- ebitmap_destroy(&lrt->range.level[1].cat);
+ ebitmap_destroy(&lrt->target_range.level[0].cat);
+ ebitmap_destroy(&lrt->target_range.level[1].cat);
kfree(lrt);
}@@ -1829,6 +1834,7 @@ int policydb_read(struct policydb *p, vo
}
if (p->policyvers >= POLICYDB_VERSION_MLS) {
+ int new_rangetr = p->policyvers >= POLICYDB_VERSION_RANGETRANS;
rc = next_entry(buf, fp, sizeof(u32));
if (rc < 0)
goto bad;
@@ -1847,9 +1853,16 @@ int policydb_read(struct policydb *p, vo
rc = next_entry(buf, fp, (sizeof(u32) * 2));
if (rc < 0)
goto bad;- rt->dom = le32_to_cpu(buf[0]);
- rt->type = le32_to_cpu(buf[1]);
- rc = mls_read_range_helper(&rt->range, fp);
+ rt->source_type = le32_to_cpu(buf[0]);
+ rt->target_type = le32_to_cpu(buf[1]);
+ if (new_rangetr) {
+ rc = next_entry(buf, fp, sizeof(u32));
+ if (rc < 0)
+ goto bad;
+ rt->target_class = le32_to_cpu(buf[0]);
+ } else
+ rt->target_class = SECCLASS_PROCESS;
+ rc = mls_read_range_helper(&rt->target_range, fp); if (rc) goto bad; lrt = rt;
security/selinux/ss/policydb.h +0 -0
@@ -106,9 +106,10 @@ struct cat_datum {
};
struct range_trans {
- u32 dom; /* current process domain */
- u32 type; /* program executable type */
- struct mls_range range; /* new range */
+ u32 source_type;
+ u32 target_type;
+ u32 target_class;
+ struct mls_range target_range; struct range_trans *next; };
Signature · 6 lines
Darrel -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.
Quoted 8 lines · Darrel Goeddel
This patch introduces support for policy version 21. This version of the binary kernel policy allows for defining range transitions on security classes other than the process security class. As always, backwards compatibility for older formats is retained. The security class is read in as specified when using the new format, while the "process" security class is assumed when using an older policy format.
Signed-off-by Darrel Goeddel <[email protected]>
We should send this up to Andrew but note that it is intended for 2.6.19, not 2.6.18. And if we want FC4 to remain functional, we either need an updated SysVinit there or an updated libsepol/checkpolicy/policy.
Quoted 6 lines
include/security.h | 3 ++- ss/mls.c | 21 ++++++++++----------- ss/policydb.c | 27 ++++++++++++++++++++------- ss/policydb.h | 7 ++++--- 4 files changed, 36 insertions(+), 22 deletions(-)
You want diffstat -p1 output here.
Quoted 138 lines
security/selinux/include/security.h +2
-1@@ -24,10 +24,11 @@ #define POLICYDB_VERSION_NLCLASS 18#define POLICYDB_VERSION_VALIDATETRANS 19#define POLICYDB_VERSION_MLS 19#define POLICYDB_VERSION_AVTAB 20 +#define POLICYDB_VERSION_RANGETRANS 21/* Range of policy versions we understand*/ #define POLICYDB_VERSION_MIN POLICYDB_VERSION_BASE -#define POLICYDB_VERSION_MAX POLICYDB_VERSION_AVTAB +#define POLICYDB_VERSION_MAX POLICYDB_VERSION_RANGETRANSextern int selinux_enabled;extern int selinux_mls_enabled;security/selinux/ss/mls.c +10
-11@@ -543,22 +543,21 @@ int mls_compute_sid(struct context *sconu32 specified, struct context *newcontext) { + struct range_trans *rtr; +if (!selinux_mls_enabled)return 0 ;switch (specified) {case AVTAB_TRANSITION : -if (tclass ==SECCLASS_PROCESS ) { -struct range_trans *rangetr; -/* Look for a range transition rule. */ -for (rangetr = policydb.range_tr; rangetr; - rangetr = rangetr->next) { -if (rangetr->dom == scontext->type && - rangetr->type == tcontext->type) { -/* Set the range from the rule */ -return mls_range_set (newcontext, - &rangetr->range); - } +/* Look for a range transition rule. */ +for (rtr = policydb.range_tr; rtr; rtr = rtr->next) { +if (rtr->source_type == scontext->type && + rtr->target_type == tcontext->type && + rtr->target_class == tclass) { +/* Set the range from the rule */ +return mls_range_set (newcontext, + &rtr->target_range); } }/* Fallthrough */ security/selinux/ss/policydb.c +20
-7@@ -96,6 +96,11 @@ static struct policydb_compat_info polic .sym_num = SYM_NUM, .ocon_num = OCON_NUM, }, + { + .version = POLICYDB_VERSION_RANGETRANS, + .sym_num = SYM_NUM, + .ocon_num = OCON_NUM, + }, };static struct policydb_compat_info *policydb_lookup_compat (int version)@@ -645,15 +650,15 @@ void policydb_destroy(struct policydb *pfor (rt = p->range_tr; rt; rt = rt -> next) {if (lrt) { -ebitmap_destroy (&lrt->range.level[0 ].cat); -ebitmap_destroy (&lrt->range.level[1 ].cat); +ebitmap_destroy (&lrt->target_range.level[0 ].cat); +ebitmap_destroy (&lrt->target_range.level[1 ].cat);kfree (lrt); } lrt = rt; }if (lrt) { -ebitmap_destroy (&lrt->range.level[0 ].cat); -ebitmap_destroy (&lrt->range.level[1 ].cat); +ebitmap_destroy (&lrt->target_range.level[0 ].cat); +ebitmap_destroy (&lrt->target_range.level[1 ].cat);kfree (lrt); }@@ -1829,6 +1834,7 @@ int policydb_read(struct policydb *p, vo }if (p->policyvers >=POLICYDB_VERSION_MLS ) { +int new_rangetr = p->policyvers >=POLICYDB_VERSION_RANGETRANS ; rc =next_entry (buf, fp,sizeof (u32));if (rc <0 ) goto bad;@@ -1847,9 +1853,16 @@ int policydb_read(struct policydb *p, vo rc =next_entry (buf, fp, (sizeof (u32) *2 ));if (rc <0 ) goto bad; - rt->dom =le32_to_cpu (buf[0 ]); - rt->type =le32_to_cpu (buf[1 ]); - rc =mls_read_range_helper (&rt->range, fp); + rt->source_type =le32_to_cpu (buf[0 ]); + rt->target_type =le32_to_cpu (buf[1 ]); +if (new_rangetr) { + rc =next_entry (buf, fp,sizeof (u32)); +if (rc <0 ) + goto bad; + rt->target_class =le32_to_cpu (buf[0 ]); + }else + rt->target_class =SECCLASS_PROCESS ; + rc =mls_read_range_helper (&rt->target_range, fp);if (rc) goto bad; lrt = rt;security/selinux/ss/policydb.h +4
-3@@ -106,9 +106,10 @@ struct cat_datum { };struct range_trans { -u32 dom;/* current process domain */ -u32 type;/* program executable type */ -struct mls_range range;/* new range */ +u32 source_type; +u32 target_type; +u32 target_class; +struct mls_range target_range;struct range_trans *next; };
Signature · 8 lines
Stephen Smalley National Security Agency -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.
James Morris
Acked-byQuoted 11 lines · Stephen Smalley
Quoted 8 lines · Darrel Goeddel
This patch introduces support for policy version 21. This version of the binary kernel policy allows for defining range transitions on security classes other than the process security class. As always, backwards compatibility for older formats is retained. The security class is read in as specified when using the new format, while the "process" security class is assumed when using an older policy format.
Signed-off-by Darrel Goeddel <[email protected]>Acked-by Stephen Smalley <[email protected]>
--
This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.