列表

详情


阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】
信息系统安全开发生命周期(Security Development Life Cycle(SDLC))是微软提出的从安全角度指导软件开发过程的管理模式,它将安全纳入信息系统开发生命周期的所有阶段,各阶段的安全措施与步骤如下图5.1所示。


【问题1】(4分)
在培训阶段,需要对员工进行安全意识培训,要求员工向弱口令说不!针对弱口令最有效的攻击方式是什么?以下口令中,密码强度最高的是(  )。
A. security2019
B. 2019Security
C. Security@2019
D. Security2019
【问题2】(6分)
在大数据时代,个人数据正被动地被企业搜集并利用。在需求分析阶段,需要考虑采用隐私保护技术防止隐私泄露。从数据挖掘的角度,隐私保护技术主要有:基于数据失真的隐私保护技术、基于数据加密的隐私保护技术、基于数据匿名隐私保护技术。
请问以下隐私保护技术分别属于上述三种隐私保护技术的哪一种?
(1)随机化过程修改敏感数据
(2)基于泛化的隐私保护技术
(3)安全多方计算隐私保护技术
【问题3】(4分)
有下述口令验证代码:

#define PASSWORD "1234567"
int verify_ password (char *password)
{
    int authenticated;
    char buffer[8];
    authenticated= "strcmp(password,PASSWORD);
    strcpy(buffer,password);
    return authenticated;
    }
    іnt mаіn(іnt аrgс, сhаr* аrgv[ ]) 
    {
       int valid_ flag=0;
       char password[1024];
       while(1)
       {
           printf("please input password: ");
           scanf("%s",password);
           valid_ flag = verify_ password(password); //验证口令
           if ( valid_ flag)//口令无效
            {
                printf("incorrect password!\n\n");
             }
             else //口令有效
             {
             printf("Congratulation! You have passed the verification!\n");
             break;

       } 
}

其中main函数在调用verify_ password函数进行口令验证时,堆栈的布局如图5.2所示。


请问调用verify_password函数的参数满足什么条件,就可以在不知道真实口令的情况下绕过口令验证功能?
【问题4】(3分)
SDLC安全开发模型的实现阶段给出了3种可以采取的安全措施,请结合问题3的代码举例说明?

参考答案:

【问题1】  

 (1)穷举攻击   (2) C

【问题2】 
(1)基于数据失真的隐私保护技术;
(2)基于数据匿名化的隐私保护技术;
(3)基于数据加密的隐私保护技术。

【问题3】  
参数password的值满足:12个字符的字符串,前面8个字符为任意字符,后面4个字符为空字符;或者输入完整的8个任意字符。

【问题4】 
使用批准的工具来编写安全正确的程序;禁用不安全的函数来防范因数组没有边界检查而导致的缓冲区溢出;通过静态分析进行程序指针完整性检查。

详细解析:

【问题1】  

(1)弱口令可以通过穷举攻击方式来破解。

(2)密码必须符合复杂性要求:启用此策略,用户账户使用的密码必须符合复杂性的要求。
密码复杂性必须符合下列最低要求:
不能包含用户的账户名;
不能包含用户姓名中超过两个连续字符的部分;
至少有六个字符长;
密码总必须包含以下4类字符中的三类字符:
1、英文大写字母(A-Z)
2、英文小写字母(a-z)
3、10个基本数字(0-9)
4、特殊符号(!@#¥%等)

【问题2】

(1)基于数据失真的隐私保护技术:它是使敏感数据失真但同时保持某些关键数据或者属性不变的隐私保护技术,例如,采用交换 (Swapping)、添加噪声等技术对原始数据集进行处理,并且保证经过扰动处理后的数据仍然保持统计方面的性质,以便进行数据挖掘等操作。
(2)基于数据加密的隐私保护技术:它是采用各种加密技术在分布式环境下隐藏敏感数据的方法,如安全多方计算 (SMC)、分布式匿名化、分布式关联规则挖掘和分布式聚类等。
(3)基于数据匿名化的隐私保护技术:它是根据具体情况有条件地发布数据,例如,不发布原始数据的某些值、数据泛化等。

【问题3】  
该代码按正常流程走下来,函数verify-password()会返回变量authenticated的值,而只有当其值为0时,会绕过口令。
再来分析strcpy() 函数这个函数,该用来复制字符串,其原型为:
char *strcpy(char *dest, const char *src);
【参数】dest 为目标字符串指针,src 为源字符串指针。
注意:src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置 src 所包含的字符串(包含结束符NULL)。
【返回值】成功执行后返回目标数组指针 dest。
strcpy() 把src所指的由NULL结束的字符串复制到dest 所指的数组中,返回指向 dest 字符串的起始地址。
注意:如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出。
主函数中,当valid—flag为0时,会绕过口令,而valid—flag是函数verify-password()的返回值,在函数verify-password()中,其返回值是变量authenticated的值,在返回该值时,使用了strcpy函数将password的值复制到数组buffer中,buffer数组的长度为8个字符,一旦用户输入数据长度大于8个字符就会溢出,溢出部分就会覆盖其他变量的值,从上图堆栈中的数据存储方式可以看出,buffer数组一旦溢出,溢出部分就会覆盖authenticated的值;根据题目意思,只要令溢出部分的值为0即可令authenticated=0,最终使得valid—flag为0,从而满足条件。所以可以先任意输入8个字符堆满buffer数组,再输入时就是溢出部分,可以输入空字符,因authenticated为整形数据,所以将字符赋给整形变量时,会按其ASCII码值进行处理,空字符的ASICC值为0,从而可以把authenticated值变成0满足条件;或者输入完整的任意8个字符,再加上复制结束自动加入的字符串结束标志“\0”,也可导致authenticated值变成0满足条件。

【问题4】  

使用批准的工具来编写安全正确的程序,只要在所有拷贝数据的地方进行数据长度和有效性的检查,确保目标缓冲区中数据不越界并有效,则就可以避免缓冲区溢出,更不可能使程序跳转到恶意代码上。禁用不安全的函数来防范因数组没有边界检查而导致的缓冲区溢出,C 语言中存在缓冲区溢出攻击隐患的系统函数有很多。例如 gets(),sprintf(),strcpy(),strcat( ),fscanf( ),scanf( ), vsprintf( )等。可以禁用这些不安全函数。通过静态分析进行程序指针完整性检查,在每次在程序指针被引用之前先检测该指针是否已被恶意改动过,如果发现被改动,程序就拒绝执行。


上一题