Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
cs423
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
zchang8
cs423
Commits
8e52f343
Commit
8e52f343
authored
5 years ago
by
zchang8
Browse files
Options
Downloads
Patches
Plain Diff
update
parent
934744b6
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
mp4-LSM/mp4.c
+239
-18
239 additions, 18 deletions
mp4-LSM/mp4.c
with
239 additions
and
18 deletions
mp4-LSM/mp4.c
+
239
−
18
View file @
8e52f343
...
@@ -10,7 +10,7 @@
...
@@ -10,7 +10,7 @@
#include
"mp4_given.h"
#include
"mp4_given.h"
typedef
struct
mp4_security
mp4_security_t
;
typedef
struct
mp4_security
mp4_security_t
;
#define XATTR_LEN
32
#define XATTR_LEN
64
#define PATH_BUF 512
#define PATH_BUF 512
/**
/**
* get_inode_sid - Get the inode mp4 security label id
* get_inode_sid - Get the inode mp4 security label id
...
@@ -26,7 +26,7 @@ static int get_inode_sid(struct inode *inode)
...
@@ -26,7 +26,7 @@ static int get_inode_sid(struct inode *inode)
* Add your code here
* Add your code here
* ...
* ...
*/
*/
char
*
buf
;
/*
char *buf;
struct dentry *dentry;
struct dentry *dentry;
int rc;
int rc;
...
@@ -41,17 +41,17 @@ static int get_inode_sid(struct inode *inode)
...
@@ -41,17 +41,17 @@ static int get_inode_sid(struct inode *inode)
if(!(inode->i_op->getxattr)){
if(!(inode->i_op->getxattr)){
// not impletment handler
// not impletment handler
if
(
printk_ratelimit
()){
//
if(printk_ratelimit()){
pr_alert
(
"input inode structure does not impletment getxattr
\n
"
);
//
pr_alert("input inode structure does not impletment getxattr\n");
}
//
}
return MP4_NO_ACCESS;
return MP4_NO_ACCESS;
}
}
dentry = d_find_alias(inode);
dentry = d_find_alias(inode);
if(!dentry){
if(!dentry){
if
(
printk_ratelimit
()){
//
if(printk_ratelimit()){
pr_alert
(
"cannot find dentry for inode at get_inode_sid
\n
"
);
//
pr_alert("cannot find dentry for inode at get_inode_sid\n");
}
//
}
return -1;
return -1;
}
}
...
@@ -73,7 +73,68 @@ static int get_inode_sid(struct inode *inode)
...
@@ -73,7 +73,68 @@ static int get_inode_sid(struct inode *inode)
xattr_cred = __cred_ctx_to_sid(buf);
xattr_cred = __cred_ctx_to_sid(buf);
}
}
kfree(buf);
kfree(buf);
return
xattr_cred
;
return xattr_cred;*/
char
*
cred_ctx
;
struct
dentry
*
de
=
d_find_alias
(
inode
);
int
ret
,
sid
,
len
;
if
(
!
de
)
{
pr_err
(
"%s, NULL dentry
\n
"
,
__func__
);
return
-
EFAULT
;
}
len
=
XATTR_LEN
;
cred_ctx
=
kmalloc
(
len
,
GFP_NOFS
);
if
(
!
cred_ctx
)
{
dput
(
de
);
pr_err
(
"%s, could not allocate mem
\n
"
,
__func__
);
return
-
ENOMEM
;
}
// Clean the momory
memset
(
cred_ctx
,
0
,
len
);
if
(
!
inode
->
i_op
->
getxattr
)
{
dput
(
de
);
kfree
(
cred_ctx
);
return
0
;
}
ret
=
inode
->
i_op
->
getxattr
(
de
,
XATTR_NAME_MP4
,
cred_ctx
,
len
);
if
(
ret
==
-
ERANGE
)
{
ret
=
inode
->
i_op
->
getxattr
(
de
,
XATTR_NAME_MP4
,
NULL
,
0
);
if
(
ret
<
0
)
{
dput
(
de
);
pr_err
(
"%s, query the correct size of xattr failed"
,
__func__
);
return
ret
;
}
len
=
ret
;
cred_ctx
=
kmalloc
(
len
+
1
,
GFP_NOFS
);
if
(
!
cred_ctx
)
{
dput
(
de
);
return
-
ENOMEM
;
}
cred_ctx
[
len
]
=
0
;
ret
=
inode
->
i_op
->
getxattr
(
de
,
XATTR_NAME_MP4
,
cred_ctx
,
len
);
}
dput
(
de
);
if
(
ret
<
0
)
{
if
(
ret
!=
-
ENODATA
)
{
pr_err
(
"%s, get the xattr failed
\n
"
,
__func__
);
kfree
(
cred_ctx
);
return
ret
;
}
}
else
{
sid
=
__cred_ctx_to_sid
(
cred_ctx
);
ret
=
sid
;
}
kfree
(
cred_ctx
);
return
ret
;
}
}
/**
/**
...
@@ -292,12 +353,9 @@ static int mp4_inode_init_security(struct inode *inode, struct inode *dir,
...
@@ -292,12 +353,9 @@ static int mp4_inode_init_security(struct inode *inode, struct inode *dir,
* returns 0 is access granter, -EACCES otherwise
* returns 0 is access granter, -EACCES otherwise
*
*
*/
*/
/*
static int mp4_has_permission(int ssid, int osid, int mask)
static int mp4_has_permission(int ssid, int osid, int mask)
{
{
/*
* Add your code here
* ...
*/
int rc = -1;
int rc = -1;
if(osid == MP4_TARGET_SID){
if(osid == MP4_TARGET_SID){
// object file is labeled
// object file is labeled
...
@@ -422,7 +480,7 @@ static int mp4_has_permission(int ssid, int osid, int mask)
...
@@ -422,7 +480,7 @@ static int mp4_has_permission(int ssid, int osid, int mask)
}
}
}
}
return rc;
return rc;
}
}
*/
/**
/**
* mp4_inode_permission - Check permission for an inode being opened
* mp4_inode_permission - Check permission for an inode being opened
...
@@ -435,12 +493,10 @@ static int mp4_has_permission(int ssid, int osid, int mask)
...
@@ -435,12 +493,10 @@ static int mp4_has_permission(int ssid, int osid, int mask)
* returns 0 if access is granted, -EACCES otherwise
* returns 0 if access is granted, -EACCES otherwise
*
*
*/
*/
/*
static int mp4_inode_permission(struct inode *inode, int mask)
static int mp4_inode_permission(struct inode *inode, int mask)
{
{
/*
* Add your code here
* ...
*/
const struct mp4_security *cur_sec;
const struct mp4_security *cur_sec;
struct dentry *dentry;
struct dentry *dentry;
char* buf;
char* buf;
...
@@ -509,6 +565,171 @@ static int mp4_inode_permission(struct inode *inode, int mask)
...
@@ -509,6 +565,171 @@ static int mp4_inode_permission(struct inode *inode, int mask)
return -EACCES;
return -EACCES;
}
}
return 0;
}*/
static
int
mp4_has_permission
(
int
ssid
,
int
osid
,
int
mask
)
{
/*
* Add your code here
* ...
*/
// If there are no masks about the MAY_READ/MAY_WRITE/MAY_ACCESS/MAY_EXEC
// pass the permission control to the Linux default access control
mask
&=
(
MAY_READ
|
MAY_WRITE
|
MAY_APPEND
|
MAY_ACCESS
|
MAY_EXEC
);
if
(
!
mask
)
goto
PERMIT
;
switch
(
osid
)
{
// May not be accessed by target, but may be any others
// So if the ssid is target, just deny
case
MP4_NO_ACCESS
:
if
(
ssid
==
MP4_TARGET_SID
)
goto
DENY
;
else
goto
PERMIT
;
// May only be read by anyone
case
MP4_READ_OBJ
:
if
((
mask
&
(
MAY_READ
))
==
mask
)
goto
PERMIT
;
else
goto
DENY
;
// May be read/write/append by target
// and read by others
case
MP4_READ_WRITE
:
if
(
ssid
==
MP4_TARGET_SID
)
if
((
mask
&
(
MAY_READ
|
MAY_WRITE
|
MAY_APPEND
))
==
mask
)
goto
PERMIT
;
else
goto
DENY
;
else
if
((
mask
&
(
MAY_READ
))
==
mask
)
goto
PERMIT
;
else
goto
DENY
;
// May be written/appended by target
// and only read by others
case
MP4_WRITE_OBJ
:
if
(
ssid
==
MP4_TARGET_SID
)
if
((
mask
&
(
MAY_WRITE
|
MAY_APPEND
))
==
mask
)
goto
PERMIT
;
else
goto
DENY
;
else
if
((
mask
&
(
MAY_READ
))
==
mask
)
goto
PERMIT
;
else
goto
DENY
;
// May be read/executed by all
case
MP4_EXEC_OBJ
:
if
((
mask
&
(
MAY_READ
|
MAY_EXEC
))
==
mask
)
goto
PERMIT
;
else
goto
DENY
;
// May be read/exec/access by all
case
MP4_READ_DIR
:
if
(
ssid
==
MP4_TARGET_SID
)
if
((
mask
&
(
MAY_READ
|
MAY_EXEC
|
MAY_ACCESS
))
==
mask
)
goto
PERMIT
;
else
goto
DENY
;
else
goto
PERMIT
;
// May be modified by all, so just permit
case
MP4_RW_DIR
:
if
(
ssid
==
MP4_TARGET_SID
)
goto
PERMIT
;
else
goto
PERMIT
;
}
PERMIT:
return
0
;
DENY:
return
-
EACCES
;
}
/**
* mp4_inode_permission - Check permission for an inode being opened
*
* @inode: the inode in question
* @mask: the access requested
*
* This is the important access check hook
*
* returns 0 if access is granted, -EACCES otherwise
*
*/
static
int
mp4_inode_permission
(
struct
inode
*
inode
,
int
mask
)
{
/*
* Add your code here
* ...
*/
struct
dentry
*
de
;
const
struct
cred
*
cur_cred
=
current_cred
();
struct
mp4_security
*
mp4_ctx
;
char
*
res
,
*
buf
;
int
osid
,
ssid
;
if
(
!
inode
)
return
0
;
// Find the dentry from inode
de
=
d_find_alias
(
inode
);
if
(
!
de
)
return
0
;
buf
=
kzalloc
(
255
*
sizeof
(
char
),
GFP_KERNEL
);
if
(
!
buf
)
{
dput
(
de
);
return
0
;
}
// Get the dentry corresponding path
res
=
dentry_path_raw
(
de
,
buf
,
255
);
if
(
IS_ERR
(
res
))
{
pr_err
(
"%s, could not find path
\n
"
,
__func__
);
kfree
(
buf
);
dput
(
de
);
return
0
;
}
// Skip the pathes which has the prefixes described in helper func
if
(
mp4_should_skip_path
(
res
))
{
kfree
(
buf
);
dput
(
de
);
return
0
;
}
// Get the object sid
osid
=
get_inode_sid
(
inode
);
if
(
osid
<
0
)
{
/*pr_err("%s, could not get osid\n", __func__);*/
osid
=
MP4_NO_ACCESS
;
}
kfree
(
buf
);
dput
(
de
);
// Check the current task credential
if
(
!
cur_cred
)
return
0
;
// Get the sid of the current task
ssid
=
MP4_NO_ACCESS
;
mp4_ctx
=
cur_cred
->
security
;
if
(
mp4_ctx
)
ssid
=
mp4_ctx
->
mp4_flags
;
/*pr_info("%s, ssid %d, osid %d\n", res, ssid, osid);*/
// Check the permissions
if
(
mp4_has_permission
(
ssid
,
osid
,
mask
))
{
pr_info
(
"%s, DENY: ssid %d, osid %d, mask 0x%x
\n
"
,
res
,
ssid
,
osid
,
mask
);
return
-
EACCES
;
}
return
0
;
return
0
;
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment