iOS SandBox란?

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


SandBox란?

외부로부터 들어온 프로그램이 보호된 영역에서 동작해 시스템이 부정하게 조작되는 것을 막는 보안 형태.
커널 수준에서 강제 적용되는 맥 OS의 접근제어 기술이다.

앱이 손상될 경우 시스템과 사용자 데이터의 손상을 억제하도록 설계되어있으며 앱스토어에 유통되는 모든 앱들은 앱 샌드박스를 적용시켜야만 한다. 애플 개발자 계정으로 앱 스토어가 아닌 다른 곳에서 유통된 앱 또한 앱 샌드박스를 적용시켜야한다.

커널: 컴퓨터와 전원을 켜면 운영체제는 이와 동시에 수행된다. 한편 소프트웨어가 컴퓨터 시스템에서 수행되기 위해서는 메모리에 그 프로그램이 올라가 있어야 한다. 마찬가지로 운영체제 자체도 소프트웨어로서 전원이 켜짐과 동시에 메모리에 올라가야 한다. 하지만, 운영체제처럼 규모가 큰 프로그램이 모두 메모리에 올라간다면 한정된 메모리 공간의 낭비가 심할것이다. 따라서 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 된다. 이 때 메모리에 상주하는 운영체제의 부분을 커널이라 한다. 또 이것을 좁은 의미의 운영체제라고도 한다. 즉 커널은 메모리에 상주하는 부분으로써 운영체제의 핵심적인 부분을 뜻한다. 이에 반에 넓은 의미의 운영체제는 커널뿐 아니라 각종 시스템을 위한 유틸리티들을 광범위하게 포함하는 개념이다. (보통은 운영체제라고 하면 커널을 말하게 된다.)

샌드박스가 적용되고 안되고의 차이

복잡한 시스템은 항상 취약점을 갖고 소프트웨어의 복잡도는 계속 증가한다.
개발자가 아무리 방어코드를 작성하고, 버그를 경계하더라도 해커들은 개발자의 방어를 한번만 뚫어내면 그만..

App SandBox가 앱을 공격하는 모든걸 막을수는 없지만 피해를 최소화할 수 있다.

샌드박스가 적용되지 않은 앱은 앱을 실행하는 사용자가 앱의 모든 권한을 가지며 사용자가 액세스 할 수 잇는 모든 리소스에 접근이 가능해진다. 만약 그 앱이나 그 앱과 연결되어있는 어떤 프레임워크 보안에 구멍이 생긴다면 해커는 잠재적으로 그 구멍을 이용해 앱을 제어할 수 있게 된다. 그리고 해커는 사용자가 할 수 있는 어떤 것이든 할수 있게 된다.

그렇다는 것은 앱을 통해 접근할 수 있는 사용자의 모든 데이터나 시스템 리소스에 접근해 무작위로 바이러스 등을 퍼뜨릴 수 있음을 의미하기도 한다.

샌드박스의 전략

앱 샌드박스는 어떤 식으로 피해를 최소한하는 것일까?

1. App SandBox는 개발자가 앱과 시스템이 어떤식으로 상호작용하게 할건지 설정할 수 있게 한다.

그럼 시스템은 앱이 하고자하는일을 끝내는데 필요한 권한만을 부여하고, 그 이상을 부여하진 않는다.

2. App SandBox는 사용자가 드래그 앤 드롭, 대화 상자 등의 친숙한 인터렉션을 통해 투명하게 앱에게 추가 엑세스 권한을 부여할 수 있도록 한다.

사용자는 앱을 사용하면서 많이 보면 얼럿창을 통해 앱에 추가 접근 권한을 부여할 수 있다.
샌드박스는 무적이 아니며 앱은 언제나 손상될 위험에 놓여있다. 하지만 앱이 업무를 수행하는데 필요한 최소한의 권한으로 권한을 제한할 경우 잠재적 피해의 범위는 줄어들 수 있다.

샌드박스의 원칙

각 앱마다 리소스에 대한 접근을 제한함으로써 앱 샌드박스는 해커가 앱의 보안구멍을 뚫었을 경우 사용자 데이터의 도난, 손상, 삭제, 시스템 하드웨어의 해킹에 대한 마지막 방어선을 구축한다. 예를 들어 샌드박스를 사용한 앱은 다음 리소스 중 하나를 사용하려면 그 의도를 반드시 명시해야 한다.

  • Hardware (Camera, Microphone, USB, Printer)
  • Network Connections (Inbound or Outbound)
  • App Data (Calendar, Location, Contacts)
  • User Files (Downloads, Pictures, Music, Movies, User Selected Files)

샌드박스 적용되는 방식

iOS의 각 앱은 모두 샌드박스 화 되어있다.

샌드박스는 각 앱에 대한 파일, 환경설정, 네트워크 리소스, 하드웨어 등에 대한 앱의 접근을 제한하는 세분화된 제어 집합이라고 볼 수 있다. 이렇게 앱마다 구분되어있기 때문에 이 앱을 사용하는 사용자는 이 앱의 데이터에만 접근이 가능해진다. 외부에 있는 데이터에 접근하기 위해서는 샌드박스 정책에 따라 접근 권한을 부여받아야 한다. 반대로 이 앱의 데이터도 다른 곳에서 접근은 불가능해진다.

앱의 샌드박스 디렉토리는 이런식으로 되어있다.

앱의 설치 시점에 각각의 샌드박스 디렉토리에 위치시키며, 이 디렉토리는 각 앱의 홈 디렉토리가 된다.
보안을 위해 앱과 시스템의 상호작용은 앱의 샌드박스 디렉토리에 있는 디렉토리로 제한된다.

홈 디렉토리는 각각 특별한 역할을 가진 컨테이너 디렉토리들을 하위 디렉토리로 가진다.

각 컨테이너에는 또한 역할이 있다.

1. Bundle Container

앱의 번들을 보유

2. Data Container

앱 및 사용자 데이터를 보유, 앱이 데이터를 정렬화하고 그룹화 하는 데 사용할 수 있는 여러 하위 디렉토리로 나뉨

3. iCloud Container

런타임에 접근을 요청할 수 있는 추가 컨테이너 디렉토리

iOS Double형 데이터를 String으로 나타내는 법(+ 소수점 표현하는 방법)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


문제상황

현재 서버에서는 Double형 데이터가 넘어오고 있다. > let double = 12.012312 이런식으로
근데 나는 이를 String으로 변환하면서 소수점 두 번째 자리까지만 보여주고 싶다.

추가로 뒤에 %까지 추가하고 싶다면?

let double: Double = 12.012312
var string: String

string = String(format: "%.2f", double) + "%"
print(string)
// 12.01% 출력됨

iOS Cannot assign value of type 'UIColor' to type '[NSUIColor]' (aka 'Array') 에러 해결하기

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Cannot assign value of type ‘UIColor’ to type ‘[NSUIColor]’ (aka ‘Array')

컬러값을 어레이에 담아서 가져오고 있는데 위와 같은 에러가 발생했다.

받아오고 있는 컬러 데이터는 아래와 같다.
["#1301239", "#123ff1", "#131942"] 이런식으로..!(안의 숫자는 그냥 임의로 적어넣은 것!)

이렇게 어레이에 담겨져 있는 스트링 값들을 UIColor로 변환하고 싶은데 어떻게 해야할까?

let color = ["#1301239", "#123ff1", "#131942"]
let hexColor = [NSUIColor(cgColor: UIColor(hexString: color).cgColor)]

이렇게 해주면 간단하게 완료우~!

UIColor Extension 이 궁금하다면 > 요기 클릭

iOS Convert UIColor to String(+# 제거하기!)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Convert UIColor to String

서버에서 컬러값을 받아오고 있는데 "#293949"이런식으로 받아오고 있었다.
즉 여기서 필요한건 해당 스트링에서 #을 제거하고 UIColor 값으로 바꿔줘야 하는 것!

UIColor를 extension해주자. 추가한 뒤 아래 코드 복붙
해당 방법은 되게 다양할텐데 나는 현재 이렇게 써주고 있다.

import Foundation
import UIKit

extension UIColor {

  convenience init(hexString: String) {

      let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)

      var int = UInt64()
      Scanner(string: hex).scanHexInt64(&int)
      let a, r, g, b: UInt64

      switch hex.count {
      case 3:
          (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
      case 6:
          (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
      case 8:
          (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
      default:
          (a, r, g, b) = (255, 0, 0, 0)
      }

      self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
  }
}

iOS Firebase 8.8.0으로 업그레이드하면서 수정할 것들

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Firebase 8.8.0 업그레이드

Firebase를 7.10.0 에서 8.8.0으로 업그레이드 하였습니다.
코코아팟을 사용했구요.

pod 'Firebase', '8.8.0'
pod 'Firebase/Core'
pod 'Firebase/Auth'
pod 'Firebase/Messaging'
pod 'Firebase/Analytics'
pod 'Firebase/Performance'
pod 'Firebase/Crashlytics'

했더니 아래와 같은 두개의 에러가 발생하였습니다.

  • ld: framework not found FirebaseInstanceID
  • ld: framework not found Protobuf

1. ld: framework not found FirebaseInstanceID

참고한 Stackoverflow

Target > BuildSetting > 서치박스에서 FirebaseInstanceID 검색

Linking에 FirebaseInstanceID가 있을 것

Linking > Other Linker Flags > Debug/Release 두개 모두에서 -framework, FirebaseInstanceID delete(-) 클릭

반드시 Debug/Release 두개 모두에서 삭제해줘야하고

-framework, FirebaseInstanceID 이 두개도 반드시 지워줘야 함

2. ld: framework not found Protobuf

참고한 Stackoverflow  이 또한 위에 FirebaseInstanceID를 삭제해주는 방식과 동일하게 처리해주면 끝!