기본 콘텐츠로 건너뛰기

typos

typos

오탈자

도전 1

whlie(*src && left)
{
	*dst++=*src++;
	
	if (left = 0)
		die("badlen");

	left--;
}

if 조건에 관계 연산자 == 대신 대입 연산자 =가 설정되어 있다. 이로 인해 left이 0으로 설정되어도 while 구문을 벗어나지 못하고 left 값을 감소시키며 반복 수행한다.

수정 코드


if (left == 0)

도전 2

int f;
f=get_security_flags(username);

if(f = FLAG_AUTHENTICATED)
{
	return LOGIN_OK;
}

return LOGIN_FAILED;

if 조건에 관계 연산자 == 대신 대입 연산자 =가 설정되어 있어 get_security_flags 결과와 무관하게 로그인 성공을 반환하고 있다.

수정 코드

if(f == FLAG_AUTHENTICATED)

도전 3

for (i==5; src[i] && i<10; i++)
{
	dst[i-5]=src[i];
}

for 조건에 대입 연산자 = 대신에 관계 연산자 ==가 설정되어 있어 i가 10보다 작은 값일 때, 버퍼를 벗어날 위험이 있다.

수정 코드

for (i=5; src[i] && i<10; i++)

도전 4

if (get_string(src) && check_for_overflow(src) & copy_string(dst, src))
	printf("string safely copied\n");

논리 연산자 && 대신에 비트 연산자 &가 조건으로 설정되어 있어 문자열 복사 작업 실패 시에도 성공 문구를 출력하고 있다.

수정 코드

if (get_string(src) && check_for_overflow(src) && copy_string(dst, src))

도전 5

if (len > 0 && len <= sizeof(dst));
	memcpy(dst, src, len);

if; 이 존재하여 길이 검사 결과와 무관하게 memcpy를 실행한다.

수정 코드

if (len > 0 && len <= sizeof(dst))

도전 6

char buf[040];

snprintf(buf, 40, "%s", userinput);

숫자 앞에 0을 접두사로 사용하면 8진수로 인식되므로 의도한 것보다 작은 배열 공간 (buf[32])을 할당하게 된다.

수정 코드

char buf[40];

도전 7

if (len < 0 || len > sizeof(dst)) /* 길이 검사
	die("bad length!");

/* length ok */

memcpy(dst, src, len);

if 뒤 주석을 닫지 않아 길이 검사를 실패할 경우에만 memcpy를 실행한다.

수정 코드

if (len < 0 || len > sizeof(dst)) /* 길이 검사 */

도전 8

if (len > 0 && len <= sizeof(dst))
	copiedflag = 1;
	memcpy(dst, src, len);

if (!copiedflag)
	die("didn't copy");

괄호가 생략되어 있어 길이 검사 결과와 무관하게 memcpy가 실행된다.

수정 코드

if (len > 0 && len <= sizeof(dst))
{
	copiedflag = 1;
	memcpy(dst, src, len);
}

도전 9

if (!strncmp(src, "magicword", 9))
	// report_magic(1);

if (len < 0 || len > sizeof(dst))
	assert("bad length!");

/* length ok */
memcpy(dst, src, len);

if에서 ;를 생략했기 때문에 memcpy는 언제나 실행된다.

수정 코드

if (!strncmp(src, "magicword", 9))
	// report_magic(1);
	;

도전 10

l = msg_hdr.msg_len;
frag_off = msg_hdr.frag_off;
frag_len = msg_hdr.frag_len;
...
if (frag_len > (unsigned long)max)
{
	al=SSL_AD_ILLEGAL_PARAMETER;
	SSLerr(SSL_F_DTLSl_GET_MESSAGE_FRAGMENT, SSL_R_EXCESSIVE_MESSAGE_SIZE);
	goto f_err;
}

if (frag_len + s->init_num > (INT_MAX - DTLSl_HM_HEADER_LENGTH))
{
	al=SSL_AD_ILLEGAL_PARAMETER;
	SSLerr(SSL_F_DTLSl_GET_MESSAGE_FRAGMENT, SSL_R_EXCESSIVE_MESSAGE_SIZE);
	goto f_err;
}

if (frag_len & !BUF_MEM_grow_clean(s->init_buf, (int)frag_len + DTLSl_HM_HEADER_LENGTH + s->init_num))
{
	SSLerr(SSL_F_DTLSl_GET_MESSAGE_FRAGMENT, ERR_R_BUF_LIB);
	goto err;
}

if (s->dl->r_msg_hdr.frag_off == 0)
{
	s->s3->tmp.message_type = msg_hdr.type;
	s->dl->r_msg_hdr.type = msg_hdr.type;
	s->dl->r_msg_hdr.msg_len = 1;
	/* s->dl->r_msg_hdr.seq = seq_num; */
}

/* XDTLS: ressurect this when restart is in place */
s->state=stn;

/* next state (stn) */
p = (unsigned char *))s->init_buf->data;

if (frag_len > 0)
{
	i=s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, &p[s->init_num], frag_len, 0);
	/* XDTLS: fix this-message fragments cannot span multiple packets */

	if (i <= 0)
	{
		s->rwstate=SSL_READING;
		*ok = 0;
		return i;
	}
}
else
	i = 0;

길이 검사 중 하나에서 논리 연산자 &&를 사용해야 하는 곳에 비트 연산자 &를 사용하는 실수를 저질렀다.

수정 코드

if (frag_len && !BUF_MEM_grow_clean(s->init_buf, (int)frag_len + DTLSl_HM_HEADER_LENGTH + s->init_num))

이 블로그의 인기 게시물

데일 카네기 인간관계론 정리

Remove-Server-Header

응답 메시지 내 서버 버전 정보 제거 1. Apache 1) 조치 방법 “/etc/htpd/conf/httpd.conf” 파일 안에서 1. ServerTokens OS → ServerTokens Prod 2. ServerSignature On → ServerSignature Off 로 변경한 후 아파치를 재시작하면 헤더 값의 아파치 버전 정보 및 OS 정보를 제거할 수 있다. 2) 참고 URL http://zetawiki.com/wiki/CentOS_ 아파치_보안권장설정_ServerTokens_Prod,_ServerSignature_Off 2. IIS 1) 조치 방법 IIS 6.0 urlscan_setup 실행. 설치. \windows\system32\inetsrv\urlscan\urlscan.ini 파일을 열어 다음 수정(RemoveServerHeader=0 을 RemoveServerHeader=1 로 변경) 서비스에서 IIS Admin Service 재시작. IIS 7.0 IIS 관리자를 열고 관리하려는 수준으로 이동합니다. 기능 보기에서 HTTP 응답 헤더를 두 번 클릭합니다. HTTP 응답 헤더 페이지에서 제거할 헤더를 선택합니다. 작업 창에서 제거를 클릭하고 예를 클릭합니다. 2) 참고 URL IIS 6.0 : http://gonnie.tistory.com/entry/iis6- 응답헤더-감추기 IIS 7.0 : https://technet.microsoft.com/ko-kr/library/cc733102(v=ws.10).aspx 3. jetty 1) 조치 방법 “jetty.xml” 파일에서 jetty.send.server.version=false 설정 2) 참고 URL http://attenuated-perspicacity.blogspot.kr/2009/09/jetty-61x-hardening.html 4. Nginx ...

American Fuzzy Lop And Address Sanitizer

American Fuzzy Lop And Address Sanitizer Address Sanitizer(ASAN) 단지 gcc/clang에 -fsanitize=address 옵션을 추가하는 것으로 간단히 사용할 수 있지만 그 효과는 충분하다. Example Out Of Bounds Read #include <stdio.h> int main() { int a[ 2 ] = { 3 , 1 }; int i = 2 ; printf ( "%i\n" , a[i]); } 예제 파일을 OutOfBoundsRead.c 로 생성하고 ASAN 옵션을 지정하여 clang 으로 컴파일하자. clang -g -fsanitize = address -fno -omit -frame -pointer OutOfBoundsRead . c -o OutOfBoundsRead 생성된 OutBoundsRead 파일을 실행하면 다음과 같은 결과를 볼 수 있다. ================================================================= ==3678==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc0ba87428 at pc 0x47b7db bp 0x7ffc0ba87390 sp 0x7ffc0ba87388 READ of size 4 at 0x7ffc0ba87428 thread T0 ==3678==WARNING: Trying to symbolize code, but external symbolizer is not initialized! #0 0x47b7da (/root/ASAN/OutOfBoundsRead+0x47b7da) #1 0x7faba0260f44 (/lib/x86_64-linux-gnu/libc.so.6+0x21f44) #2 0x...