Attacking Javascript Engines - The Bug

크리에이티브 커먼즈 라이선스
Creative Commons License

오늘은 문서의 2장인 버그 자체에 대한 설명을 정리합니다



The Bug

우선 이 버그는 ECMA 표준에 정의 돼있는 Array.prototype.slice(start, end) 메소드의 JavaScriptCore 구현체에서 발생합니다.

JavaScriptCore에서는 Source/JavaScriptCore/runtime/ArrayPrototype.cpp 에 arrayProtoFuncSlice 라는 이름으로 구현돼있습니다


Array.prototype.slice는 php의 substring, python의 "asdf"[a:b] 등과 같이 배열이나 문자열을 slice하는 메소드 입니다


먼저 slice메소드를 사용하는 예시를 문서에 나온 그대로 보겠습니다

a.slice는

첫번째인자 <= N < 두번째 인자인 N번째 요소들의 집합을 만듭니다

그래서 1,3 으로 했을때

a[1], a[2] 두개인 [2,3]이라는 array가 만들어집니다




이 slice의 구현체를 봅시다

slice의 구현체는 

/root/browny/WebKit/320b1fc/webkit/Source/JavaScriptCore/runtime/ArrayPrototype.cpp

여기에 arrayProtoFuncSlice 라는 이름의 함수로 있습니다


아래는 문서에서 정리한 소스코드입니다

    // 1. Obtain the reference object for the method call
    JSObject* thisObj = exec->thisValue().toThis(exec, StrictMode).toObject(exec);
    if (!thisObj)
        return JSValue::encode(JSValue());


    // 2. Retrive the length of the array
    unsigned length = getLength(exec, thisObj);
    if (exec->hadException())
        return JSValue::encode(jsUndefined());

    // 3. Convert the arguments (start and end index) into native integer types and clamp them to the range [0, length)
    unsigned begin = argumentClampedIndexFromStartOrEnd(exec, 0, length);
    unsigned end = argumentClampedIndexFromStartOrEnd(exec, 1, length, length);

    // 4. Check if a species constructor should be used
    std::pair<SpeciesConstructResult, JSObject*> speciesResult = speciesConstructArray(exec, thisObj, end - begin);
    // We can only get an exception if we call some user function.
    if (UNLIKELY(speciesResult.first == SpeciesConstructResult::Exception))
        return JSValue::encode(jsUndefined());

    // 5. Perform the slicing
    if (LIKELY(speciesResult.first == SpeciesConstructResult::FastPath && isJSArray(thisObj))) {
        if (JSArray* result = asArray(thisObj)->fastSlice(*exec, begin, end - begin))
            return JSValue::encode(result);
    }

1. this를 구합니다. 즉 a.slice에서 a를 구합니다

2. 배열의 길이를 구합니다

3. begin에는 0번째인자, end에는 2번째 인자를 넣습니다. argumentClampedIndexFromStartOrEnd는 a.slice(-2, 4)나 a.slice(1, 5) 등에 대해서도 정상 작동하게 구현돼있습니다

4. species라는건 상속관계를 뜻하는것 같습니다. 어레이의 요소들이 바꼈을 때 새로 생성자를 호출해야되는지를 체크하는거 같기도 하네요 잘 모르겠습니다

5. fast slice를 호출합니다 ( 이 취약점은 fast slice 에서만 발생합니다 )


fast slice에서만 취약점이 발생한 이유는 문서에서 설명하고 있는데

slow slice에서는 요소를 가져올 때 오브젝트에 getProperty를 호출하고 hadExecption을 체크하는데 여기서 바운드 체크를 한다고 합니다



argumentClampedIndexFromStartOrEnd 함수는 이름이 참 긴데

두번째인자 (위의 slice코드에서 begin은 0, end는 1로 설정된 그 값)으로 인자를 가져오고

그 값을 toInteger해서 native 자료형으로 변경합니다


함수 분석을 모두 적기는 제가 힘들어서 대충 쓰면

toInteger에서 toNumber를 호출합니다

toNumber에서는 toPrimitive와, toPrimitive에서 리턴된 오브젝트에서 toNumber를 호출합니다

toPrimitive에서는  callToPrimitiveFunction<TypeHintMode::TakesHint>(exec, this, exec->propertyNames().toPrimitiveSymbol, preferredType); 를 호출합니다


callToPrimitiveFunction에서는 오브젝트의 toPrimitive함수를 호출합니다

primitive라는 용어는 https://developer.mozilla.org/en/docs/Glossary/Primitive 여기에 잘 설명 돼있습니다



이런식으로 인자가 number뿐만 아니라 String, Boolean, Symbol 등 다른 primitive의 경우에도 가능하다면 숫자로 변환시켜줍니다

유연한 형변환을 위한 구현인 것 같습니다

예를 들어서 서버에서 정수를 받아와서 인자에 바로 넣었는데 이런 유연한 형변환을 지원하지 않는다면 

func(a, b); 라고 하면 될것을

func(int(a), int(b)); 와 같이 쓰게 됩니다

이런 편의성을 지원하기 위해 만들어진 개념 같습니다


근데 이런 기능들이 특정 primitive에만 한정돼서 유연하다면 결국 number만 허용하는것과 다를게 없겠죠

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf

이 문서에서는 valueOf라는 메소드를 이용해 값을 조작하는데,

위 링크에 잘 설명이 돼있습니다

한번 따라해보면


이렇게 값을 참조할때 코드를 실행시키게 할 수 있습니다

CVE-2016-4622는 바로 이런 기능을 이용해서 공격하는 취약점입니다



이렇게 간단하게도 사용이 가능합니다


문서에 나와있는걸 똑같이 해보면


이렇게 앞의 0.123, 1.123을 제외하면 원래 있던 값이 사라졌습니다

아무리 length를 0으로 설정했어도 slice에서 10을 리턴했기 때문에

똑같이 a가 있던곳에서 10개만큼을 출력해 줄텐데

뒤에 값이 사라진 이유는 array의 length를 0으로 설정하면 실제 메모리상에서도 줄이면서  realloc을 하기 때문입니다


이게 첫길이와 그다음길이가 64이상 차이가 나야하는데, 그이유는 문서에 쉽게 설명돼있습니다

64바이트 이상 차이가 나지 않으면 배열을 재할당하는것보다 배열 요소를 모두 지우고 그냥 쓰는게 낫다고 합니다



그런데 0.123, 1.123은 왜 남아있고 그뒤에부터 삭제돼있는지 알아봅시다

그걸 알아보기 위해선 a라는 변수가 어떻게 변했는지를 알아야겠죠

그래서 a.slice를 하기전과 후에 print(a)를 넣고, print함수의 구현체에 breakpoint를 걸어 확인해봅시다




섹션 5.2 디버깅 예제

우선 더 쉬운 예제가 섹션 5.2에 있습니다

이 문서 쓰신분이 디버깅 방법에 대해서는 좀 대충대충 넘어가셔갖고 혼자 삽질하면서 깨우친것들인데

우선 디버깅하기 제일 쉬운방법은 JavaScriptCore/jsc.cpp 에 있는 functionPrint 함수에다가 exec->argument(0); 을 %p로 찍는 코드를 집어넣고

lldb나 gdb에서 functionPrint에 브레이크포인트를 건다음

실행하다가 브포가 걸리면 fini로 함수를 실행시킵니다

그러면 인자의 주소가 나오는데 그걸 x/16gx로 보시면됩니다(거의 모든 데이터형이 8바이트기 때문에 g로 봅니다)



우선 jsc.cpp의 functionPrint에 디버깅코드 추가




디버깅 대상 오브젝트고, 저는 print함수에 브포를 걸어서 확인할꺼기 때문에

섹션 5.2에서는 선언만했지만 저는 print도 넣었습니다


gdb로 jsc열고 functionPrint에 브레이크포인트 걸음


실행하고 브포걸린 상태에서 fini로 함수를 실행하면

exec->argument(0), 즉 obj의 주소가 나옴



보면은 일단 첫 8바이트는 JSCell이라고 합니다 뭔지는 일단 저도 스킵하고

두번째가 Butterfly 포인터라고 합니다

근데 null로 설정 돼 있는 이유는 문서에서 설명하기로는 모든 프로퍼티들이 인라인으로 저장돼서라는데 먼소린진 모르겠다

근데 그다음 값들은 태그를 이해하고 있으면 이제 잘보인다

0xffff000000001337 == Integer 0x1337

0x0000000000000006 == Pointer ( False )

0x402bbd70a3d70a3d == 태그가 1~0xfffe니까 double,

0x00007fffb1fcfee0 == 태그가 pointer니까 포인터


double

여기서 유일하게 해석이 어려웠던게 double 이였는데

0x402bbd70a3d70a3d 가 double인건 알겠는데 

https://gregstoll.dyndns.org/~gregstoll/floattohex/ 여기서 converting하면 13.37이 아니라 13.87로 나옵니다

그래서 왜그런가 하다가 floating point 태그가 0x0001 부터 시작하니까 0x0001000000000000을 빼주면 되지 않을까 싶어서 빼니까 13.37이 잘 나왔습니다

그러니까

0x402bbd70a3d70a3d 으로 돼있으면

0x402abd70a3d70a3d 로 값을 읽어야합니다

// 아니 근데 빼야 제대로된 값이 나올때가 있고 안빼야 나올때가 있는데 대체 어떨때 빼야되는거지



array

float은 그렇고 우리는 지금 array를 보고 있기 때문에

0x7fffb1fcfee0을 봅시다

보면은 위에서 obj 자체를 봤을때는 butterfly pointer가 null이였는데 여기서는 값이 설정 돼있습니다

그 이유를 생각해보면 butterfly는 포인터 왼쪽에 property, 오른쪽에 elements를 가지는 구조인데

배열은 element의 나열이 필요하기 때문에 butterfly pointer가 설정돼있는 것 같습니다

그래서 확인해보면


array에 있었던 Integer형의 1,2,3,4가 들어있습니다

그럼 이제 우리는 array를 보는 방법도 압니다




문서에 나와있는 예제 코드 분석

그러면 이제 드디어 왜 0.123, 1.123은 남아있고 그다음은 이상한값, 그리고 그 뒤에는 0으로 채워져있었는지 확인해봅시다


먼저 디버깅을 위해 print를 추가한 코드입니다

첫 print에서 array의 주소를 확인하고

두번째 print에서 array의 주소를 다시 확인해봅니다



첫 print에서 본 배열입니다

배열 element들의 시작은 0x7fffb33e4148부터입니다



그다음 slice를 하면서 valueOf에서 length를 0으로 바꿔버렸고

그게 JSArray::setLength에서 정한 threshold보다 차이가 높기 때문에 reallocate가 발생해 배열의 시작주소가 0x7fffb33e4148 에서 0x7fffb33e4740으로 바꼈습니다

값들을 좀 살펴보면


이렇게 돼있고, 이 값은 print(b)에서 나오는 값과 똑같습니다

근데 여기에는 두번나오고 b에서는 한번나온다는점이 다른데, 그 다음 b는 어떻게 돼있나 보죠


우선은 아까 엄청 위에서 했었을때와 같은 값들이 출력이 됐구요

0.123, 1.123 이 있고 그다음 2.121995~~ 가 이제 무슨값이였는지 알게 됐습니다

이렇게 앞에 두개가 남아있는 이유는 아직은 알지 못하겠고

오늘은 여기까지만하고 내일 reallocateAndShrinkButterfly함수를 분석해봐야 알 것 같습니다

그냥 쉽게 생각할 수 있는건 slice의 첫 인자는 0으로 고정돼있으니까 0.123은 무조건 들어갈 거라고 예상할 수 있고, 1.123도 뭐 바로 다음이니까 들어갈 수 있긴 할텐데

정확한 코드 흐름을 내일 더 분석해봐야 알 것 같습니다


오늘은 여기까지

신고

설정

트랙백

댓글

정보보호 분야에서의 병역특례 제도를 통한 병역 이행에 관해

씨디팔공/글 2017.01.04 10:46
크리에이티브 커먼즈 라이선스
Creative Commons License

저도 지금 정보보안업체에서 근무하고 있는 미필로서 주변 친구들과도 병역 의무에 대해 얘기를 많이 나누는데, 대부분 전해듣거나 주워들은 얘기라 그냥 그렇다던데? 이렇게만 알고 있어서 제대로 알기 위해 정리합니다


이 글에서 정리하는 내용은 국가법령정보센터에서 제공하는 병역법 조항을 근거로 합니다


정의


병역법에서 우리가 얘기하는 병역 특례, 즉 보안 업체에서 근무하는 것으로 병역을 대체하는 복무에 대해서 정리 합니다.


16. "전문연구요원"이란 학문과 기술의 연구를 위하여 제36조에 따라 전문연구요원(專門硏究要員)으로 편입되어 해당 전문 분야의 연구업무에 복무하는 사람을 말한다.

17. "산업기능요원"이란 산업을 육성하고 지원하기 위하여 제36조에 따라 산업기능요원(産業技能要員)으로 편입되어 해당 분야에 복무하는 사람을 말한다.

18. "병역지정업체"란 전문연구요원이나 산업기능요원이 복무할 업체로서 다음 각 목의 업체를 말한다.

가. 제36조에 따라 병무청장이 선정한 연구기관, 기간산업체 및 방위산업체

나. 「농어업경영체 육성 및 지원에 관한 법률」 제19조에 따른 농업회사법인(이하 "농업회사법인"이라 한다)

다. 「농업기계화 촉진법」 제11조제2항에 따른 농업기계의 사후관리업체(이하 "사후관리업체"라 한다)


여기서 말하는 전문연구요원과 산업기능요원에 관한 조항인 36조를 보면


제36조(병역지정업체의 선정 등) ① 병무청장은 연구기관·기간산업체 및 방위산업체 중에서 전문연구요원이나 산업기능요원이 복무할 병역지정업체(농업회사법인과 사후관리업체는 제외한다)를 대통령령으로 정하는 기준에 따라 선정한다.  <개정 2016.5.29>

   ② 병역지정업체로 선정되지 아니한 연구기관·기간산업체 및 방위산업체가 제1항에 따라 선정된 병역지정업체를 인수하는 등 대통령령으로 정하는 사유에 해당하게 되면 병역지정업체로 선정된 것으로 본다.  <개정 2016.5.29>

   ③ 병무청장은 제1항에 따라 선정된 병역지정업체가 폐업 등 대통령령으로 정하는 사유에 해당하게 되면 병역지정업체의 선정을 취소할 수 있다.  <개정 2016.5.29>

   ④ 병무청장은 군(軍)에서 필요로 하는 인원의 충원에 지장이 없는 범위에서 전문연구요원이나 산업기능요원으로 편입할 수 있는 인원을 결정하고 대통령령으로 정하는 바에 따라 병역지정업체별 배정인원을 결정한다. 이 경우 산업기능요원의 편입 인원 결정 및 병역지정업체별 배정인원 결정과 관련하여 합리적인 이유 없이 학력 및 출신학교 등을 이유로 차별을 하여서는 아니 된다.  <개정 2014.12.30, 2016.5.29>

   ⑤ 관할 지방병무청장[병역지정업체 또는 「농어업경영체 육성 및 지원에 관한 법률」 제10조에 따른 후계농업경영인 및 후계어업경영인(이하 "후계농어업경영인"이라 한다)의 사업장이 있는 행정구역을 관할하는 지방병무청장을 말한다. 이하 이 절에서 같다]은 다음 각 호의 어느 하나에 해당하는 사람으로서 제39조에 따른 의무복무기간을 35세(제37조제1항제3호에 해당하는 사람은 37세)까지 마칠 수 있는 사람에 대하여는 전문연구요원(제3호에 해당하는 사람은 제외한다) 또는 산업기능요원으로 편입시킬 수 있다. 이 경우 현역병입영 대상자는 보충역에 편입한다.  <개정 2011.11.22, 2013.6.4, 2016.5.29>

1. 현역병입영 대상자

2. 사회복무요원 소집 대상인 보충역

3. 사회복무요원

   ⑥ 병역지정업체의 장은 약정한 근로조건을 성실히 이행하겠다는 서약서를 지방병무청장(병무지청장을 포함한다)에게 제출하여야 한다.  <개정 2016.5.29>

   ⑦ 제1항부터 제6항까지의 규정에 따른 병역지정업체의 선정·승계·선정취소, 전문연구요원 또는 산업기능요원으로의 편입 및 서약서의 제출에 필요한 사항은 대통령령으로 정한다.  <개정 2016.5.29>

  [전문개정 2009.6.9]

  [제목개정 2016.5.29] 


병역지정업체에 관해서는 다음 글에서 상세히 다루겠습니다

우선 36조 5항의 bold처리된 부분을 보면 제 39조를 베이스로 하면서

1. 현역병 입영 대상자(1급~3급)

2. 사회복무요원 소집 대상인 보충역(4급)

3. 사회복무요원(복무 중인 사회복무요원으로 생각됩니다)

위 세 호 중 하나에 해당된다면 전문연구요원 혹은 산업기능요원으로 근무할 수 있다고 되어 있고

1호에 해당하는 현역병 입영 대상자는 법적으로 보충역으로 편입된다고 합니다



제 39조에는 병특 복무기간에 대한 내용이 있습니다


  ① 전문연구요원과 산업기능요원은 해당 분야에서 다음 각 호의 구분에 따른 기간 동안 의무복무를 하여야 하며, 그 기간을 마치면 사회복무요원의 복무를 마친 것으로 본다.  <개정 2013.6.4., 2016.5.29.>

1. 전문연구요원: 3년

2. 산업기능요원: 2년 10개월. 다만, 사회복무요원 소집 대상인 보충역에서 편입된 산업기능요원은 2년 2개월로 하고, 사회복무요원으로 복무하다가 편입된 사람은 대통령령으로 정하는 기준에 따라 산정한 남은 복무기간으로 한다.

② 전문연구요원 및 산업기능요원에 대하여는 제55조에 따른 군사교육소집을 하며, 그 군사교육소집 기간은 의무복무기간에 산입한다.  <개정 2016.5.29.>

③ 전문연구요원이나 산업기능요원은 편입 당시 병역지정업체의 해당 분야에 복무하여야 한다. 다만, 병역지정업체의 폐업 등 대통령령으로 정하는 경우와 복무하는 병역지정업체의 변경, 관련업무 수행을 위한 파견·교육훈련, 학문 및 기술의 지도, 그 밖에 부득이한 사유로 인하여 편입 당시 병역지정업체의 해당 분야에 복무시킬 수 없어 대통령령으로 정하는 바에 따라 관할 지방병무청장의 승인 또는 허가를 받은 경우에는 그러하지 아니하다.  <개정 2016.5.29.>

④ 전문연구요원과 산업기능요원으로 편입될 사람은 제1항의 의무복무기간 중 성실히 복무하겠다는 서약서를 제출하여야 한다.  <개정 2016.5.29.>

⑤ 전문연구요원과 산업기능요원이 복무하여야 할 해당 분야, 의무복무기간의 계산, 서약 등 복무에 필요한 사항은 대통령령으로 정한다.  <개정 2016.5.29.>

[전문개정 2009.6.9.]




저와 같이 일반 회사에서 근무할 경우는 산업기능요원으로 분류 됩니다.

현역병 입영 대상자에서 산업기능요원으로 편입될 시에는 2년 10개월을 업체에서 근무하고, 4급 판정을 받은 보충역의 경우는 2년 2개월 근무합니다

전문연구요원의 정의에 대해서는 제 37조를 참고하시면 됩니다. 저와 무관한 내용이기 때문에 생략합니다



산업기능요원 편입 대상

 ① 다음 각 호의 어느 하나에 해당하는 사람은 원할 경우 제36조에 따른 산업기능요원으로 편입할 수 있다. 이 경우 제1호와 제2호에 해당하는 사람(사회복무요원과 사회복무요원 소집 대상인 보충역은 제외한다)과 제5호에 해당하는 사람은 대통령령으로 정하는 기술자격이나 면허를 갖추어야 한다.  <개정 2011.11.22., 2013.6.4., 2016.5.29.>

1. 병역지정업체로 선정된 공업·광업·에너지산업·건설업·수산업 또는 해운업 분야의 기간산업체에 복무하고 있는 사람(수산업 또는 해운업 분야의 경우에는 승선하여 복무하고 있는 사람이나 승선하여 복무할 사람만 해당한다)

2. 「방위사업법」 제18조와 제35조에 따른 전문연구기관 및 방위산업체{군정비부대(軍整備部隊)를 포함한다} 중에서 병역지정업체로 선정된 전문연구기관 또는 방위산업체에 복무하고 있는 사람

3. 국제적 수준의 기능을 가진 사람 중 국가이익을 위하여 특별히 필요하다고 인정하여 대통령령으로 정하는 사람

4. 후계농어업경영인으로서 관할 특별시장·광역시장·특별자치시장·도지사·특별자치도지사(특별시장·광역시장·도지사로부터 권한을 위임받은 시장·군수·구청장을 포함한다. 이하 이 절에서 같다)의 추천을 받은 사람

5. 농업회사법인의 농업기계운전요원 및 사후관리업체에 복무하고 있는 사람으로서 관할 특별자치시장·특별자치도지사·시장·군수·구청장의 추천을 받은 사람

② 제1항에도 불구하고 제1항제1호의 공업 분야 기간산업체 및 제1항제2호의 방위산업체에서 정보처리 직무 분야에 복무하는 사람은 병무청장이 정하는 관련학과의 전공, 기술훈련과정의 수료 또는 해당 분야의 복무경력이 있어야 한다.  <개정 2016.5.29.>

[전문개정 2009.6.9.] 


우리에게 해당되는 조항은 제 38조 1항과 2항중에 하나로 보이는데,

2항에서 얘기하는 방위사업법 제18조와 제 35조를 보면 국방과 직접적으로 관련된 연구기관이나 방위산업체를 명시하고 있습니다

따라서 우리가 해당되는 조항은 제 1항입니다

(이에 관해서 더 정확한 정보를 원하시는 분은 병역법 시행령 제 72조 1항 1호와 제 72조 2항 1호를 보시면 됩니다, 여기에 보안업체도 기간산업체로 정의돼있습니다)



즉 우리는 제 38조 1항 1호에 해당되므로 제 38조 1항에 따라 대통령령으로 정하는 특정 기술자격이나 면허를 갖추어야 한다는 것을 알 수 있습니다


여기서 얘기하는 대통령령은 병역법 시행령을 뜻합니다


병역법 시행령 제 79조를 봅시다


제79조(기간산업 분야 복무자 등의 산업기능요원 편입) ① 법 제38조제1항제1호 및 제2호에 따라 산업기능요원에 편입할 수 있는 사람은 병역지정업체에 복무하는 사람으로서 다음 각 호의 구분에 따른 기준에 해당하는 사람으로 하되, 분야별 및 업종별 편입 대상과 부족한 군 필요적성 등 세부 편입기준에 관한 사항은 병무청장이 정한다.  <개정 2013.12.4, 2016.11.29> 


제 79조 1항을 보면 

1. 현역병입영 

대상자: 별표 2의 학력별 기술자격 등급기준에 해당하는 사람 

이렇게 돼있습니다

근데 별표2와 전문연구요원 및 산업기능요원의 관리규정 27조가 겹치는데 관리규정이 별표2 내용을 포함하고 있기 때문에 관리규정을 봅시다




 ① 법 제38조에 따라 정보처리 직무분야에 기능요원으로 편입 또는 전직할 수 있는 대상 업종은 다음 각 호와 같다. <각호개정 2010. 3.31>

1. 정보처리업

2. 게임소프트웨어개발업

3. 애니메이션제작업

4. 영상게임기제작업

5. 정보통신기기제조업

6. 방위산업

② 법 제38조에 따라 정보처리 직무분야에 기능요원으로 편입 또는 전직할 수 있는 사람은 다음 각 호와 같다.

1. 현역병입영대상자: 정보처리 직무분야 기술자격(정보처리, 전자계산기조직응용) 소지자로서 제3항 각 호의 어느 하나에 해당하는 사람

2. 사회복무요원 복무중단자 및 사회복무요원소집대상보충역: 제3항 각 호의 어느 하나에 해당하는 사람 <개정 2013.12. 4>

③ 법 제38조제2항에 따라 병무청장이 정하는 정보처리 직무분야 관련학과의 전공, 기술훈련과정의 수료 또는 해당분야의 복무경력을 갖춘 사람은 다음 각 호와 같다.  <개정 2016.11.30.>

1. 고등학교의 정보처리 직무분야 관련학과를 졸업한 사람

2. 대학(원)의 정보처리 직무분야 관련학과를 주전공으로 2년 이상 이수한 사람 또는 복수(연합, 연계)전공이나 부전공으로 전 과정을 이수한 사람 <개정 2016. 5. 2.>

3. 「학점인정 등에 관한 법률」에 따라 제2호에 해당하는 사람과 동등한 학력을 인정받은 사람

4. 「근로자 직업능력 개발법」제2조에 따른 공공직업훈련시설의 정보처리 직무분야 기술훈련과정을 2년 이상 이수한 사람

5. 지방병무청장이 정보처리 직무분야에서 2년 이상 복무한 것으로 인정하는 사람  <개정 2016.11.30.>

6. 제4호에 따른 이수기간 및 제5호에 따른 복무경력이 각각 6개월 이상이고 그 합이 2년 이상인 사람  <개정 2016.11.30.>

④ 제3항의 정보처리 직무분야 관련학과는 다음 각 호와 같다.

1. 「국가기술자격법 시행령」제14조제7항의 “별표 4의2"에 따라 고용노동부장관이 정하는 정보처리 직무분야 관련학과 <개정 2013. 1.24, 2015. 5.19>

2. 지방병무청장이 학과명칭, 교과과정 등을 고려하여 정보처리 직무분야 관련학과로 인정한 학과

⑤ 제1항제1호부터 제3호까지의 규정에 해당하는 업체는 제2항 해당하는 사람에 한하여 기능요원으로 편입할 수 있다. <개정 2010. 3.31>

⑥ 병무청장은 제1항제4호와 제5호에 해당하는 업체의 배정인원 중 정보처리 직무분야에 편입할 수 있는 인원의 범위를 정할 수 있다. <개정 2010. 3.31>

⑦ 삭제 <2011. 9.29> 


먼저 현역병입영 대상자는 정보처리(산업기사|기사) 자격증 혹은 전자계산기조직응용은 제가 뭔지 모르겠으니 스킵하고, 정보처리 자격증을 취득하여야 하고

신검 4급 판정을 받았으면 병특을 위해 따로 자격증 취득이 필요하지 않습니다


3항을 보면

1호. 선린고, 디미고 등 특성화 고등학교에 해당

2호. 정보처리 분야 학과를 2년 이상 수료한 사람(전문학사 이상)

3호. 학점은행제나 독학사 등으로 전문학사 이상을 수료한사람

5호. 정보처리 관련 회사에서 2년이상 근무한 사람


여기서 저는 현역병입영대상자기 때문에 정보처리 산업기사 혹은 기사를 취득하고

제가 2015년 8월 24일 입사했으니 3항 5호에 의해 2017년 8월 24일이 되는 시점에 학력과 상관없이 산업기능요원 편입 자격이 갖춰집니다



병특 기간중 학점 취득

저는 학점은행제를 이용해 학사를 취득하고 대학원을 진학하려는 계획을 갖고 있습니다

하지만 병특을 만약 올해 말에 바로 시작할 수 있게 된다면 병특 기간중에 학점 취득이 안될 경우 대학원 진학까지 시간이 많이 늘어나기 때문에 찾아봤습니다


학위 취득에 관한건 아직 찾아보지 않았지만,

 ① 고등학교 이상의 학교의 장은 징집·소집 또는 지원에 의하여 입영하거나 소집 등에 의한 승선근무예비역 또는 보충역 복무(사회복무요원, 예술·체육요원, 공중보건의사, 병역판정검사전담의사, 공익법무관, 공중방역수의사, 전문연구요원 또는 산업기능요원으로 복무하는 것을 말한다. 이하 제74조에서 같다)를 하는 학생에 대하여는 입영 또는 복무와 동시에 휴학하게 하고, 그 복무를 마쳤을 때에는 원할 경우 복학시켜야 한다. 등록기간이 지났어도 학사일정에 지장이 없는 사람은 원할 경우 복학시켜야 한다.  <개정 2010.1.25., 2013.6.4., 2016.1.19., 2016.5.29.>

② 제1항의 학교(고등학교 또는 이에 해당하는 학력인정을 받은 교육시설은 제외한다)의 장은 제1항에 따라 입영 또는 복무로 인하여 휴학 중인 사람이 방송·통신 또는 인터넷 등 정보통신망을 활용한 원격수업을 수강하여 학점을 취득하려는 경우 학칙으로 정하는 바에 따라 등록을 허용할 수 있다. 

③ 입영부대 또는 복무기관의 장은 징집 또는 지원에 의한 복무로 휴학 중인 사람이 제2항에 따라 등록이 허용된 경우 복무에 지장이 없는 범위에서 원격수업을 수강할 수 있도록 하고, 원격수업의 수강에 필요한 통신장비 및 시설을 갖추도록 노력하여야 한다.  <신설 2013.6.4.>

④ 국방부장관은 교육부장관과 협의하여 병역의무를 이행 중인 사람의 학점취득 인정이 확대되도록 필요한 조치를 하여야 하고, 제2항에 따른 학교의 장과 협의하여 비용의 지원이나 그 밖에 학점취득 인정에 필요한 조치를 하도록 노력하여야 한다.  <신설 2014.5.9.>


병역법 제 73조에 따라 병역 이행중 학점 취득은 학점 인정기관 (학교, 학점은행제 사업체 등)의 재량에 따른 것으로 본인이 학점을 취득하고 있는 기관에서 병역 이행중 학점 취득을 허용한다면 아무런 문제가 없습니다




생각나는 것들 위주로 먼저 찾아봤는데 또 궁금한게 생기면 찾고 정리해서 공유하겠습니다

신고

설정

트랙백

댓글

Attacking Javascript Engines - Introduction to Overview

크리에이티브 커먼즈 라이선스
Creative Commons License

스터디 내부용으로만 공유하려고 작성한 글이기 때문에 그런것같이 보이는 문장들이 많습니다

이 글에서 공부하는 문서는 http://phrack.org/papers/attacking_javascript_engines.html 입니다


우리가 보는 문서의 CVE 넘버는 CVE-2016-4622 입니다

트렌드마이크로의 Samuel Gross가 올해 초에 발견한 취약점이라고합니다


이 취약점으로 메모리릭도 되고 페이크객체 삽입도 가능해서 이거 취약점 하나만 갖고도 익스플로잇이 가능하다고 하네요

버그가 커밋 650552a에서 수정됐고 우리가 지금 다운받아서 테스트하는 커밋인 320b1fc가 마지막으로 취약한 버젼이라고 합니다

커밋 2fa4973에서 처음 발생한 취약점인데, 2015년 초에 처음 취약코드가 커밋되고 1년동안 안발견되다가 올해 초에 발견된 취약점이라고 합니다


커밋 2fa4973를 보면 "splice에 있는 것처럼 빠르게 memcpy로 딱 처리하고 끝내는 조건이 필요할 것 같아서 커밋했다" 라고 주석을 달아 커밋했습니다

그래서 취약점 패치 커밋인 650552a를 보면 splice와 slice가 모두 같은방식으로 패치됐습니다



프랙에 나와있는 모든 내용을 사파리 9.1.1에서 다 테스트를 완료 하고 문서를 쓴거라고 하니 문서를 다 이해하고 직접 취약버젼 다운받아서 웹 브라우져상에서 쉘 따는것도 해보면 재밌을 것 같아요 (아직 사파리 옛날버젼 다운받는법은 못찾았습니다)



이 취약점을 제대로 이해하기 위해선 자바스크립트 엔진의 인터널을 잘 이해하고 있어야 하기 때문에 처음에 기본지식들을 다룹니다



Javascript envine overview


자바스크립트 엔진은 대체로

1. 하나 이상의 JIT Compiler를 포함한 컴파일러 아키텍쳐

2. 자바스크립트 VM

3. eval, slice같은 빌트인 함수들의 구현체

이렇게 세가지를 기본적으로 포함하고 있다고 합니다


이 문서에서는 1번은 제외하고 2번과 3번에 대한 이해가 필요하다고 하네요




The VM, Values, and NaN-boxing

먼저 자바스크립트 VM은 그냥 우리가 아는 VM입니다

컴파일러에서 유저 코드를 분석해서 바이트코드를 생성하면, 그 바이트코드를 실행시켜주는 역할을 합니다


문서에서는 VM에 대해서는 딱 이만큼만 설명하고 넘어갑니다


NaN-boxing도 지금 오버뷰를 보는 순간에는 자세하게 알 필요는 없고 그냥 나중에 디버거로 메모리를 봤을 때 원하는 값을 찾을 수 있을 정도로만 알면 될 듯 합니다

JSC에서는 값을 Pointer, Double, Integer로 나눠서 저장 한다고 하고

Pointer의 최상위 2바이트는 0

Double의 최상위 2바이트는 1~65534(0x1 ~ 0xfffe)

Integer의 최상위 2바이트는 65535(0xffff)

라고 합니다

그래서 어떤 변수에 0xcd80cd80을 할당해주고 메모리에서 보면

0xffff0000cd80cd80 으로 보인다는 얘기죠


[False, True, Undefined, Null] 이 네가지는 포인터로 저장된다고 하고 enum을 하나씩 할당 받았습니다

False는 0x0000000000000006

True는 0x0000000000000007

Undefined는 0x000000000000000a

Null은 0x0000000000000002

각각 메모리에서 이렇게 보일 겁니다

꼭 중요하게 여기고 정확히 이해하고 넘어갈 필요는 없어보이고 이런게 있다 정도만 알면 될 것 같습니다



Objects and Arrays

이 장에서는 비교적 중요해보이는 Butterfly 라는 구조를 다룹니다

문서를 중반정도 읽다가 자꾸 butterfly butterfly 해서 이해를 못했었는데 Overview에서 처음에 설명이 돼있더라구요


butterfly는 오브젝트 포인터를 기준으로, 오브젝트의 프로퍼티와 엘레먼트가 양옆으로 날개처럼 퍼져있는 형상이라 해서 붙여진 이름입니다



사진은 프랙에서 가져왔습니다


이런식으로 어떤 오브젝트 포인터가 있으면 선형으로 멤버가 쭉 있는게 아니라

좌속성 우요소로 날개처럼 퍼져있는 형태를 갖습니다

그래서 나중에 디버깅할때 나는 이 오브젝트의 프로퍼티에 0x41414141을 넣었는데 왜 보이질 않아! 할때 이걸 기억해서 아 오브젝트 포인터 말고 오브젝트 포인터-100정도에서 100바이트를 읽어보자 하면 찾을 수 있습니다



그뒤에 인덱싱관련해서 얘기가 나오는데

a = [];

a[0] = 42;

a[10000] = 42;

라는 코드가 있을 때 이 어레이는 10001개짜리 int형 어레이가 아니라

10000번째 인덱스 부터 저장한다는 의미의 영역을 새로 하나를 매핑을 해서 효율적으로 관리를 한다고는 하는데 문서에서도 너무 간단히 설명하고 넘어가는 내용이라 아직 중요한지는 잘 모르겠습니다


그리고 이거는 좀 중요할 수 있어 보이는데

숫자 배열이 있을 때 모든 숫자 하나하나에 NaN-boxing을 적용 시키면 

[1, 2, 3, 4, 5] 가 있을 때

[0xffff000000000001, 0xffff000000000002, 0xffff000000000003, 0xffff000000000004, 0xffff000000000005]; 이렇게 적용되기 때문에 이 값을 저장하고 가져오는데 의미없는 Nan-Boxing, NaN-Unboxing 과정을 거치게 되고, 또 공간도 불필요하게 많이 사용하게 됩니다

따라서 네이티브 타입을 지원하는 배열 형태도 있다고 합니다




Functions

문서는 함수를 엄청 장황하게 길게 설명 해놨는데, 그냥 함수들이 가질 수 있는 예약어가 있다는걸 설명하는 것 같습니다.

이 파트는 뒤에를 안읽어봐서 그런건진 모르겠는데 딱히 볼 필요 없는 섹션같습니다

그냥 오디팅 할 때 함수 구현체에서 볼 수 있는 특징? 을 아주 간단히 정리해둔 것 같습니다


신고

설정

트랙백

댓글


티스토리 툴바