보안약점 설명
7.1 DNS Lookup에 의존한 보안결정 DNS는 공격자에 의해 DNS 스푸핑 공격 등이 가능하므로 보안 결정을 DNS 이름에 의존할 경우, 보안결정 등이 노출되는 보안 약점

ex)도메인명으로 신뢰성을 검증하지 말고 IP주소를 사용하여 DNS변조에 대응
7.2 취약한 API 사용 취약하다고 알려진 함수를 사용함으로써 예기치 않은 보안위협에 노출될 수 있는 보안약점


ex) socket = new Socket("127.0.0.1", 10000);
보안기능이 없는 소켓을 직접 사용.

프레임워크에서 제공하는 클래스를 이용
URL url = "http://127.0.0.1:10000");
URLConnection conn = url.openConnection();

 

'IT 자격증 > SW보안약점진단원' 카테고리의 다른 글

시간 및 상태  (0) 2022.07.12
에러처리  (0) 2022.07.12
코드오류  (0) 2022.07.12
캡슐화  (0) 2022.07.12
SW보안약점진단원 양성과정 교육 신청  (0) 2022.06.30
Posted by Lumasca
,
보안약점 설명
6.1 잘못된 세션에 의한 데이터 정보노출
잘못된 세션에 의해 인가되지 않은 사용자에게 중요정보가 노출 될 수 있는 보안약점
6.2 제거되지 않고 남은 디버그 코드
디버깅을 위해 작성된 코드를 통해 인가되지 않은 사용자에게 중요정보가 노출될 수 있는 보안약점

logger.d("personal info");

삭제
6.3 시스템 데이터 정보노출
사용자가 볼 수 있는 오류 메시지나 스택 정보에 시스템 내부 데이터나 디버깅 관련 정보가 공개되는 보안약점

logger.e(e.getMessage());
=>
logger.e("NullPointException")
6.4 Public 메소드부터 반환된 Private 배열
Private로 선언된 배열을 Public으로 선언된 메서드를 통해 반환 (return)하면, 그 배열의 레퍼런스가 외부에 공개되어 외부 에서 배열이 수정될 수 있 는 보안약점

ex)
private Data[] datas;
public Data[] getData() {
   return datas;
}

=>
public Data[] getData() {
  Data[] datas=newData[datas.length];
   for(inti =0; i < datas.length; i++){
      datas[i] = this.datas[i].clone();
   }
   return datas;

}

6.5 Private 배열에 Public 데이터 할당 Public으로 선언된 데이터 또는 메서드의 파라미터가 Private로 선언된 배 열에 저장되면, Private 배열을 외부에서 접근할 수 있게 되는 보안약점

ex)
private Data[] datas;
public void setData(Data[] datas) {
   this.datas = datas;
}

=>

public void setData(Data[] datas) {
   this.datas = new Data[datas.length];
   for(int i = 0; i < datas.length; i++){
      this.datas[i] = datas[i].clone();
   }

}

'IT 자격증 > SW보안약점진단원' 카테고리의 다른 글

시간 및 상태  (0) 2022.07.12
에러처리  (0) 2022.07.12
코드오류  (0) 2022.07.12
API 오용  (0) 2022.07.12
SW보안약점진단원 양성과정 교육 신청  (0) 2022.06.30
Posted by Lumasca
,

이번에 2022년 SW보안약점 진단원 양성과정 3차 교육을 신청했다.

교육기간이 평일이라 휴가를 5일이나 내야하는 부담이 있다.

 

KISA의 연간 교육 계획을 확인한다.

https://academy.kisa.or.kr/edu/planning03.kisa

 

KISA LMS

 

academy.kisa.or.kr

 

원하는 차수를 클릭하면 교육신청 페이지로 이동하는데 접수기간이 아니면 상태는 '접수마감'이다.

상태는 접수기간 시작일 오전 10시 정각에 신청하기(?) 버튼으로 변경된다.

마감이 빨리된다는 글을 봐서 빨리 진행하느라 신청페이지는 캡쳐하지 못했다.

신청페이지는 개인정보 몇개를 입력해야한다. 

 

접수가 되면 메일이 온다.

경력 증빙서류는 발신자 메일주소(edu@kisec.com)로 보내면 된다.

 

나의 경우는 교육신청서, 자격확인신청서, 건강보험자격득실확인서랑 소프트웨어 기술자 경력증명서를 제출했다.

소프트웨어 기술자 경력증명서는 KOSA 관리하는 경력관리시스템을 통해 발급받을 수 있다.

이 시스템은 등록시에도 돈을 지불해야하고 증명서발급에도 2천원을 결제해야 한다.

오래전 근무하던 회사 다닐때 등록해두었는데 몇번 경력증빙이 필요한 경우에 대체 증빙으로 사용할때 요긴하다.

 

https://career.sw.or.kr/

 

소프트웨어기술자 경력관리시스템

SW기술자 경력확인 한번으로 두고두고 편리한 경력관리 SW기술자 경력확인제도는 SW기술자의 경력 입증의 어려움을 해소하고, 지속적인 경력관리를 통해 공신력있는 경력증빙 및 권익보호를 위

career.sw.or.kr

 

자격확인신청서(엑셀)는 아래와 같은 양식으로 되어 있다.

현재소속된 정보를 작성하고 노란색 소속기관에 근무했던 회사, 개발경력 프로젝트에는 근무했던 회사에서 수행한 프로젝트를 기입했다. 진단경력 프로젝트는 없으니 공백으로 처리했다.

서류상 제출이 어려운 경력은 우측에 별도로 기입하도록 구성되어 있다.

 

교육신청서(한글)는 자격확인신청서에 작성한 개발경력프로젝트를 개발경력란에 그대로 기입하고 인쇄한 다음,

개인정보활용 동의서에 서명한후, 사진을 찍어서 pdf 파일로 만들었다.

이렇게 준비된 파일을 메일로 보내면 이렇게 답장이 온다. (15분정도후)

 

 

 

교육후기(https://lumasca.tistory.com/1149)

 

시험준비(https://lumasca.tistory.com/1150)

 

시험후기(https://lumasca.tistory.com/1151)

 

최종합격(https://lumasca.tistory.com/1153)

'IT 자격증 > SW보안약점진단원' 카테고리의 다른 글

시간 및 상태  (0) 2022.07.12
에러처리  (0) 2022.07.12
코드오류  (0) 2022.07.12
API 오용  (0) 2022.07.12
캡슐화  (0) 2022.07.12
Posted by Lumasca
,

텍스트와 이미지가 함께 구성하는 경우가 종종 발생한다. ImageView를 별도로 구성하지 않고 TextView의 속성을 이용하면 쉽게 처리할 수 있다.

 

아래는 layout XML 의 내용이다.

 

root layout 태그에 xmlns:app="http://schemas.android.com/apk/res-auto" 를 추가한다.

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

보통 왼쪽 오른쪽에 추가하는 케이스가 많은데 오른쪽은   app:drawableEndCompat, 왼쪽은 app:drawableStartCompat 을 이용하면 된다. 그리고 텍스트와 이미지 사이 간격은  android:drawablePadding 으로 조절한다.

<TextView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:fontFamily="@font/font_medium"
     android:includeFontPadding="false"
     android:text="더보기"
     android:textAppearance="@style/Text14White"
     app:drawableEndCompat="@drawable/icon_angle_greater"
     app:drawableStartCompat="@drawable/icon_info"
     android:drawablePadding="10dp"
/>

 

소스코드로 설정할 경우, TextView의 setCompoundDrawables(left, top, right, bottom) 메소드를 이용해서 drawable을 원하는 위치에 설정해주면 된다.

val iconInfo = ContextCompat.getDrawable(requireContext(), R.drawable.icon_info)
val iconBracket = ContextCompat.getDrawable(requireContext(), R.drawable.icon_angle_greater)
binding.tvPoint.setCompoundDrawables(icon, null, iconBracket, null)

'개발 > Android' 카테고리의 다른 글

풍선도움말 레이아웃 구현  (1) 2021.03.24
프로젝트에 NDK 모듈 추가하기  (0) 2021.03.05
ViewBinding  (0) 2021.02.25
Android Studio Rename Package  (0) 2021.02.24
Appium 설치  (0) 2021.02.17
Posted by Lumasca
,

Mac을 사용할때 Command(⌘) 를 조합해서 입력하는 경우가 많은데 이 키의 위치때문에 다른키랑 함께 누르기가 참 불편하다.

 

이때 키 맵핑 앱을 사용하면 키보드의 키 설정을 변경할 수 있다.

 

프로그램의 홈페이지로 이동해서 다운로드를 하자.

https://karabiner-elements.pqrs.org/

 

Karabiner-Elements

A powerful and stable keyboard customizer for macOS.

karabiner-elements.pqrs.org

Download 버튼의 아래 화살표를 클릭하면 MacOS 버전정보가 나타난다. 

본인의 OS에 맞는 버전을 선택하면 Karabiner-Elements dmg 파일을 다운로드 한다.

 

설치는 dmg 파일을 더블클릭하면 Karabiner-Elements.pkg 아이콘이 보인다. 더블클릭해서 설치를 진행한다.

 

설치가 완료되면 Karabiner-Elements 를 실행한다.

아래와 같은 화면이 나타나는데 화면 아래쪽에 있는 Add Item 버튼을 클릭하면 키 매핑정보를 추가할 수 있다.

From key는 변경하려는 실제 키, To key는 실제키 대신에 사용할 가상의 키라고 보면 된다.

 

개인적으로 command키가 caps lock 위치에 있는 것을 선호한다. (해피해킹 키보드처럼..) 키조합이 훨씬 편하다.

예) caps_lock 키에 left command 키를 매핑시키고자 한다면 From key 항목을 클릭해서 caps_lock을 선택하고, To key를 선택해서 left_command를 선택해주면 된다. caps lock 기능도 써야하니 left_command 키에는 caps_lock 키를 설정해 주었다.

 

key항목을 누르면 아래와 같이 다양한 키들을 매핑시킬 수 있다. 

F 키(Funcion key)도 설정을 변경할 수 있다.

'개발 > Dev Others' 카테고리의 다른 글

Shell 에서 excutable Jar 만들기  (0) 2020.03.26
Github commit  (0) 2020.01.03
MySQL Config  (0) 2017.07.04
파이어폭스 한글입력 오류  (0) 2016.09.13
PHP for IIS 설치  (2) 2009.11.22
Posted by Lumasca
,

위와 같은 뷰를 구현하려고 보니 기존에 나인패치 이미지를 이용하고 있었다. 

매번 이미지 요청하기도 그렇고 xml을 이용해 할 수 있는 방법을 찾아보았다.

 

먼저 우측하단 모서리를 제외한 코너에 라운드가 적용된 사각형 모양을 작성한다. (drawable/bg_banner.xml)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="#462c94"></solid>

    <corners android:topLeftRadius="8dp" android:topRightRadius="8dp"
        android:bottomLeftRadius="8dp" android:bottomRightRadius="0dp" />

</shape>

 


다음은 사각형 아래에 붙는 꼬리 삼각형 모양을 작성한다. (drawable/bg_banner_tail.xml)

 

크기는 width, height

위치는 item 태그내부의 gravity

모양은 path 태그의 pathData

M x,y 는 (x,y)로 이동하여서 새로운 경로를 시작

Z 는 시작 경로지점으로 선을 그려서 경로를 닫음

 

위 속성을 적절히 수정해가면 삼각형 모양을 만들 수 있다.

 

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" >
<item
    android:width="8dp"
    android:height="8dp"
    android:gravity="bottom|left">
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="8dp"
        android:height="8dp"
        android:viewportWidth="8.0"
        android:viewportHeight="8.0">
        <path
            android:pathData="M 0,8 8,8 0,0z"
            android:fillColor="#462c94"/>
    </vector>
</item>
</layer-list>

 


이제 위에서 작성한 2개의 drawable을 이용해 레이아웃을 작성한다. (layout.xml )

관리 편의상 TextView와 ImageView를 하나의 Layout에 넣는다. 

 

 

<androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/layoutBanner"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="visible"
            >

            <TextView
                android:id="@+id/txtBanner"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/bg_banner"
                android:gravity="center"
                android:paddingStart="8dp"
                android:paddingTop="8dp"
                android:paddingEnd="8dp"
                android:paddingBottom="8dp"
                android:text="풍선도움말"
                android:textColor="#ffffff"
                />

            <ImageView
                android:id="@+id/txtBannerTail"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/bg_banner_tail"
                app:layout_constraintBottom_toBottomOf="@+id/txtBanner"
                app:layout_constraintLeft_toRightOf="@+id/txtBanner" />
        </androidx.constraintlayout.widget.ConstraintLayout>

'개발 > Android' 카테고리의 다른 글

TextView 에 이미지 포함하기  (0) 2021.08.26
프로젝트에 NDK 모듈 추가하기  (0) 2021.03.05
ViewBinding  (0) 2021.02.25
Android Studio Rename Package  (0) 2021.02.24
Appium 설치  (0) 2021.02.17
Posted by Lumasca
,

NDK는 아래 링크에서 다운로드해서 설치하면 된다.

 

developer.android.com/ndk/downloads

 

NDK 다운로드  |  Android NDK  |  Android Developers

개발 플랫폼에 맞는 NDK 패키지를 선택합니다. NDK 최신 버전 및 이전 버전의 변경사항에 관한 정보는 NDK 버전 기록을 참조하세요. macOS용 공증된 NDK가 필요하다면 ZIP 파일이 아닌 App Bundle을 다운

developer.android.com

프로젝트의 local.properties에 경로를 설정해주면 된다. 

 

ndk.dir=/Users/계정/Library/Android/sdk/ndk
sdk.dir=/Users/계정/Library/Android/sdk

 

NDK 모듈은 보통 c++로 작성된 라이브러리를 사용하거나 보안을 위해서 사용하곤 한다.

JNI(Java Native Interface)는 자바기반의 클래스에서 Native 코드에 접근하기 위한 인터페이스이다.

 

Java <-> JNI <-> C/C++


이제 NDK 모듈을 추가해보자.

 

스튜디오의 File -> New -> New Module ... 메뉴를 선택한다.

 

 

모듈 타입을 정하는 화면이 나오는데 Android Library 를 선택하고 Next 버튼을 클릭한다.

모듈명, 패키지명을 적절히 입력하고 Finish를 클릭하면 모듈이 생성된다.

 

모듈의 main 폴더를 우클릭하고 신규 디렉토리를 생성한다.

 

새 디렉토리 이름은 jni를 입력하고 Enter 키를 누른다. 보통 jni 폴더를 생성해서 cpp나 mk 파일을 그 폴더 내부에 넣는다.

 

이제 make 파일을 생성하자.

jni 폴더를 우클릭하고 새 파일을 생성한다. 

 

 

 

Android.mk 내용

#소스파일 위치: 현재 디렉터리
LOCAL_PATH := $(call my-dir)

#동일한 변수가 중복 사용되는 것을 방지
include $(CLEAR_VARS)

#모듈 이름
LOCAL_MODULE    := crypto
#소스파일 목록(c, cpp)
LOCAL_SRC_FILES := crypto.cpp

#LOCAL_CPPFLAGS := -fexceptions
#LOCAL_DEFAULT_CPP_EXTENSION := cpp
#LOCAL_LDLIBS += -llog

#빌드적용. 이게 정의 안되면 빌드할 모듈이 없다고 함
include $(BUILD_SHARED_LIBRARY)

아래 파일은 컴파일시 추가적으로 설정이 필요할때 사용한다. 없어도 무관..

Application.mk

#NDK 프로젝트 위치
#APP_PROJECT_PATH
#모듈이름
#APP_MODULES

#debug, release(기본)
APP_OPTIM := debug

#C소스 컴파일 플래그
#APP_CFLAGS
#C++소스 컴파일 플래그
#APP_CXXFLAGS
#C/C++ 컴파일 플래그
APP_CPPFLAGS := -frtti -fexceptions

#지원할 ABI, 모두는 all
APP_ABI := arm64-v8a armeabi-v7a

#사용할 library
APP_STL := c++_static

#APP_PLATFORM := android-29
NDK_TOOLCHAIN_VERSION := clang

#특정 Android.mk를 지정. 기본은 jni 밑에 Android.mk 파일 사용.
#APP_BUID_SCRIPT

 

자바 클래스를 생성한다.

public class Crypto {

	//crypto.cpp 에 정의할 함수, native 키워드가 붙는다.
    public static native byte[] getKey();

    static {
    //라이브러리 로딩, LOCAL_MODULE에 작성한 이름(so 파일명 앞에 lib만 제거된 이름과 동일)
        System.loadLibrary("crypto");
    }
}

 

이제 c/c++ 함수를 작성할 소스파일( cpp) 파일을 생성한다.

jni 폴더를 우클릭하고 C/C++ Source File을 클릭한다.

 

cpp 소스파일에 테스트할 코드를 간단히 작성한다.

 

함수명 작성 규칙은 JNIEXPORT $리턴타입 JNICALL Java_$패키지명_$클래스명_$함수명 이다.

리턴타입은 JNI 타입인데 자바에서 사용하는 데이터 타입 앞에 j를 붙인다.

byte -> jbyte

배열은 뒤에 Array를 붙인다. jbyteArray

 

패키지명은 현재 NDK 모듈의 패키지명이다. 

클래스명은 위에서 생성한 자바 클래스 명이다. 함수명은 자바 클래스에 정의된 함수명이다.

자바클래스와 cpp 함수간에 규약이 맞지 않으면 오류로 표시된다.

#include <jni.h>
  
  const char key[] = {
		0x10, 0x12, 0x49, 0x51,
		0x55, 0x48, 0x76, 0x5F,
		0x65, 0x6A, 0x6C, 0x33,
		0x6E, 0x6K, 0x77, 0x44
	};
    
  extern "C"
  
  JNIEXPORT jbyteArray JNICALL Java_com_test_cryptolib_Crypto_getKey(
		JNIEnv* env, jobject){
    jbyteArray array = env->NewByteArray(16);

    jbyte *bytes = env->GetByteArrayElements(array, 0);
    for(int i =0; i < sizeof(key); i++){
        bytes[i] = key[i];
    }
    env->SetByteArrayRegion(array, 0, 16, bytes);

    env->ReleaseByteArrayElements(array, bytes, 0);

    return array;
  }

$cd src/main

이 폴더에서 빌드하지 않으면 Your APP_BUILD_SCRIPT points to an unknown file: 오류가 발생한다.

 

이제 빌드를 하면...

$ndk-build

 

src/main/libs 폴더에 APP_ABI 에 정의한 이름( arm64-v8a, armeabi-v7a) 으로 폴더별로 so 파일이 생성된다.

 

 

생성된 so 파일들은 사용할 프로젝트의 src/main/jniLibs/ 폴더에 복사한다. 폴더구조는 그대로 유지한다.

src/main/jniLibs/arm64-v8a, src/main/jniLibs/armeabi-v7a 

 

이제 라이브러리를 사용할 자바 클래스를 생성한다. 패키지 경로는 NDK 모듈의 경로를 그대로 사용해야 한다. 

위에서 생성한 자바 클래스를 패키지 경로 그대로 복사하도록 한다.

 

 

사용할때는 Crypto.getKey(); 처럼 호출하면 된다.

 

'개발 > Android' 카테고리의 다른 글

TextView 에 이미지 포함하기  (0) 2021.08.26
풍선도움말 레이아웃 구현  (1) 2021.03.24
ViewBinding  (0) 2021.02.25
Android Studio Rename Package  (0) 2021.02.24
Appium 설치  (0) 2021.02.17
Posted by Lumasca
,

사진 편집 프로그램인 PhotoScape가 필요하다. 다운로드 하러 간다.

 

x.photoscape.org/

 

PhotoScape X for Mac and Windows 10

History There is a mouse issue in macOS ( Mojave 10.14.0 ~ 10.14.3 and Catalina 10.15 ). A fix for this will be available shortly. --> * Version 4.1.1 (Nov 6, 2020) * Version 4.1 (Oct 22, 2020) (PhotoScape X 4.1 for Windows 10 will be released very soon) -

x.photoscape.org

 

오른쪽의 MAC 다운로드를 클릭한다.

 

App Store 열기를 클릭한다.

 

 

앱이 설치된 상태여서 OPEN 버튼으로 되어 있다.

설치가 안된 상태라면 GET으로 되어 있다. 버튼을 클릭하면 INSTALL로 바뀐다. 클릭해서 설치한다.

설치가 완료되면 OPEN 버튼을 클릭해서 실행한다.

 

상단 메뉴탭에서 사진편집 으로 이동한다.

그리고 편집할 사진이 있는 폴더를 선택한다.

그러면 해당폴더가 팝업되면서 아래와 같은 메시지가 노출될 것이다. 허용 버튼을 클릭한다.

 

그럼 아래 처럼 폴더내 이미지 파일을 볼수 있다.

모자이크를 적용할 사진을 선택한다.

 

오른쪽 편집메뉴에서 도구 버튼을 클릭하면 아래쪽에 모자이크 도구가 보인다. 클릭한다.

 

이미지에서 정보를 식별불가하게 만들것이므로 브러시 크기만 조절한다.  슬라이더로 좌우로 움직여서 적절한 크기를 설정한다.

 

마우스로 모자이크 처리할 영역을 드래그하면 뭉개지게 된다.

 

이제 저장하도록 한다. 우측 하단에 저장버튼이 있다. 클릭한다.

 

저장 팝업이 나타나는데 적절히 옵션을 설정하고 저장 버튼을 눌러서 저장하면 된다.

 

Posted by Lumasca
,