如何保證oj的安全

如何保證oj的安全


本人在安全方面的知識比較匱乏析校,本文只是對代碼運行時如何保證oj的安全做分析妥凳。

兩種方案

  • ptrace

    顧名思義這個函數(shù)時對進程進行跟蹤的啊送,它是提供給父進程一種跟蹤檢查子進程的能力扶踊,包括監(jiān)視子進程的寄存器的值(這也是我用來保證oj安全的一種方法)干发。

  • docker

    這是一種容器的概念绞愚,一種新的虛擬化技術(shù)叙甸,但它不是虛擬機,它的啟動是虛擬機無法比的位衩。
    它可以保證容器之間互不影響裆蒸,因為本身具有虛擬機的概念,所以糖驴,我們oj的程序可以丟在里面隨便跑僚祷,
    即使執(zhí)行rm -rf /*這種騷操作也不會影響真正的物理機。(但本文所說的不是采用這種方式)

ptrace

  • ptrace 與 gdb

    或許說道ptrace讓人很懵(我第一次聽說是這樣)贮缕,但是說到gdb就再熟悉不過了吧辙谜,其實gdb的調(diào)試原理就是基于ptrace的。
    首先gdb會和要調(diào)試的程序關(guān)聯(lián)起來感昼,就是建立跟蹤關(guān)系装哆,父進程(gdb)fork出子進程,子進程調(diào)用ptrace設(shè)置第一個參數(shù)為PTRACE_TRACEME
    這樣子進程(被調(diào)試的程序)收到的所有信號(不包括SIGKILL)都會被父進程捕獲定嗓,此時父進程就可以去觀察子進程的內(nèi)存蜕琴,寄存器狀態(tài)甚至修改他們。

  • 如何使用ptrace保證oj代碼安全執(zhí)行

    說到這個問題首先就要講一下系統(tǒng)調(diào)用的原理了宵溅。

    • 什么是系統(tǒng)調(diào)用

      簡單來說就是給用戶程序提供一種訪問操作系統(tǒng)更高特權(quán)的服務(wù)的能力奸绷,
      具體可以移步維基百科-系統(tǒng)調(diào)用

    • 系統(tǒng)調(diào)用如何實現(xiàn)的

      • 把系統(tǒng)調(diào)用號寫入eax寄存器
      • 提供參數(shù)
      • 觸發(fā)int 0x80中斷(此中斷就是用于系統(tǒng)調(diào)用的)
      • 從eax獲取返回值

    明白了系統(tǒng)調(diào)用原理,現(xiàn)在要保證oj的代碼執(zhí)行安全就很容易了层玲,由于所有的函數(shù)調(diào)用最終都會轉(zhuǎn)化到系統(tǒng)調(diào)用上
    (讓我想到了計網(wǎng)的everthing over ip, ip over everthing),每個系統(tǒng)調(diào)用都有系統(tǒng)調(diào)用號(具體查看#include <syscall.h>)辛块,所以我們的oj只需要去跟蹤程序的系統(tǒng)調(diào)用是否合法畔派,從而
    保證oj的安全。原理就是:

    • 和用戶提交的程序建立跟蹤與被跟蹤關(guān)系
    • 監(jiān)視系統(tǒng)調(diào)用
    • 獲取系統(tǒng)調(diào)用號
    • 合法放行润绵,不合法發(fā)送SIGKILL信號

    代碼框架:

        int fdRes[2];
        int ret1 = pipe(fdRes);
        pid_t pid;
        int res;
        pid = fork();
        long orig_rax;
        chdir(workDir.c_str());
        if(pid > 0)
        {
            close(fdRes[1]);
    
            while(1)
            {
                waitpid(pid,&res,0);
                //獲取系統(tǒng)調(diào)用號
                orig_rax = ptrace(PTRACE_PEEKUSER,pid,8*ORIG_RAX,NULL);
                if(orig_rax >= 0 && sysCall[orig_rax] == OK_CALL/*判斷是否合法*/)
                    printf("The child made a system call %ld\n",orig_rax);
                else if(orig_rax < 0){
                    break;
                }else{
                    cout<<"非法系統(tǒng)調(diào)用:"<<orig_rax<<endl;
                    //非法系統(tǒng)調(diào)用线椰,殺死進程
                    kill(pid,SIGKILL);
                    break;
                }
                //跟蹤系統(tǒng)調(diào)用
                ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
            }
            char buf[1024];
            //讀取程序運行結(jié)果
            read(fdRes[0],buf,sizeof(buf));
            close(fdRes[0]);
            runRes = buf;
            if(res == 0) {
                this->status = RUN_OK;
            } else {
                this->status = RUN_ERROR;
            }
            cout<<"運行結(jié)果:"<<runRes<<endl;
    
        } else {
            close(fdRes[0]);
            freopen("data.in", "r", stdin);
            //運行用戶程序 todo
            dup2(fdRes[1], STDOUT_FILENO);
            dup2(fdRes[1], STDERR_FILENO);
            //建立跟蹤關(guān)系
            ptrace(PTRACE_TRACEME, 0, NULL, NULL);
            this->doRun();
            close(fdRes[1]);
            exit(0);
        }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尘盼,隨后出現(xiàn)的幾起案子憨愉,更是在濱河造成了極大的恐慌,老刑警劉巖卿捎,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件配紫,死亡現(xiàn)場離奇詭異,居然都是意外死亡午阵,警方通過查閱死者的電腦和手機躺孝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來底桂,“玉大人植袍,你說我怎么就攤上這事∽雅常” “怎么了于个?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長暮顺。 經(jīng)常有香客問我厅篓,道長,這世上最難降的妖魔是什么拖云? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任贷笛,我火速辦了婚禮,結(jié)果婚禮上宙项,老公的妹妹穿的比我還像新娘乏苦。我一直安慰自己,他們只是感情好尤筐,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布汇荐。 她就那樣靜靜地躺著,像睡著了一般盆繁。 火紅的嫁衣襯著肌膚如雪掀淘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天油昂,我揣著相機與錄音革娄,去河邊找鬼倾贰。 笑死,一個胖子當著我的面吹牛拦惋,可吹牛的內(nèi)容都是我干的匆浙。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼厕妖,長吁一口氣:“原來是場噩夢啊……” “哼首尼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起言秸,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤软能,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后举畸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體查排,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年俱恶,在試婚紗的時候發(fā)現(xiàn)自己被綠了雹嗦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡合是,死狀恐怖了罪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情聪全,我是刑警寧澤泊藕,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站难礼,受9級特大地震影響娃圆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛾茉,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一讼呢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谦炬,春花似錦悦屏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吼鳞,卻和暖如春看蚜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赔桌。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工供炎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渴逻,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓碱茁,卻偏偏與公主長得像裸卫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纽竣,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 又來到了一個老生常談的問題,應用層軟件開發(fā)的程序員要不要了解和深入學習操作系統(tǒng)呢茧泪? 今天就這個問題開始蜓氨,來談?wù)劜?..
    tangsl閱讀 4,104評論 0 23
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧队伟!Ngi...
    JokerW閱讀 32,650評論 24 1,002
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法穴吹,類相關(guān)的語法,內(nèi)部類的語法嗜侮,繼承相關(guān)的語法港令,異常的語法,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • 頂著壓力看了這部電影锈颗,確實好看顷霹。1998年的電影竟然如此經(jīng)典。(重點不在愛情击吱。)
    覓雪尋梅閱讀 175評論 1 0
  • 【1】 脂分泌過旺 油性皮膚袍辞,皮脂腺過于發(fā)達,皮脂分泌過旺常摧,導致毛孔被堵塞或者其他原因?qū)е屡庞筒粫辰劣酰ぶ蜁诿?..
    慕如脂芳香手作工作室閱讀 772評論 1 0