平成30/ 2018-10-23 21:59
iOS/Security Overview
セキュリティ概要

>> About Software Security
>>--------

In the cloud-enabled, highly networked world of modern computing, security is one of the most important facets of proper software engineering.
現代のコンピューティングのクラウド対応、高度にネットワークの世界では、セキュリティが適切なソフトウェア工学の最も重要な側面の一つです。

The most important thing to understand about security is that it is not a bullet point item. You cannot bolt it
on at the end of the development process. You must consciously design security into your app or service from
the very beginning, and make it a conscious part of the entire process from design through implementation,
testing, and release.

セキュリティについて理解する最も重要なことは、それが箇条書き項目ではないということです。あなたはそれをボルトで固定することはできません
開発プロセスの最後に上。あなたが意識的にあなたのアプリケーションやサービスからにセキュリティを設計する必要があります
非常に、始めて、設計から実装を介してプロセス全体を意識一部に
テスト、およびリリース。


>> At a Glance
概要

At the application layer, security means being aware of how your code uses information and ensuring that it
does so safely and responsibly. For example, it is your responsibility to:

アプリケーション層では、セキュリティは、コードが情報をどのように使用するかを意識すると保証することを意味し、それ
とても安全かつ責任を持って行います。例えば、それはへのあなたの責任です。

● Keep users’ personal data safe from prying eyes. Store the data in a secure way, and ensure that your
software collects only the information that it requires.
● Treat untrusted files and data with care. If your software accesses the Internet or reads files that might
have previously been sent to someone over the Internet, your software must properly validate the data.
If it does not, it might inadvertently provide a vector for attackers to access other personal data that may
be stored on the user’s computer or other mobile device.
● Protect data in transit. If your software transmits personal information over the Internet, you must do so
in a safe and secure fashion to prevent unauthorized access to or modification of the data while in transit.
● Verify the authenticity of data where possible. If your software provides access to or works with signed
data, it should verify those signatures to ensure that the data has not been tampered with.

●詮索好きな目から安全に、ユーザーの個人データを保管してください。安全な方法でデータを保存し、確認することをお
ソフトウェアは、それが必要とする情報のみを収集する。
●注意して、信頼できないファイルやデータを扱います。お使いのソフトウェアは、インターネットにアクセスしたり、ファイルを読み込む場合は、その可能性がある
以前にインターネットを介して誰かに送信された、あなたのソフトウェアがデータを適切に検証する必要があります。
そうでない場合は、誤って他の個人データにアクセスする攻撃者のためのベクターを提供するかもしれないことかもしれない
ユーザのコンピュータまたは他のモバイルデバイス上に格納することができる。
●送信中のデータを保護します。お使いのソフトウェアは、インターネット上で個人情報を送信する場合は、これを行う必要があります
安全かつ確実な方法で転送中に不正にアクセスしたり、データの変更を防止します。
●データ、可能な限りの信頼性を確認。お使いのソフトウェアは、へのアクセスを提供するか、署名して動作するかどうか
データは、データが改ざんされていないことを保証するためにそれらの署名を検証すべきである。


>> Threat Models Help You Identify Areas of Risk
脅威モデルは、あなたがリスク分野を特定するヘルプ

In the planning phase, you must determine the nature of the threats to your software and architect your code in such a way that maximizes security. To do this, you should build up a threat model that shows ways in which your software might be attacked.
RelevantChapter: “RiskAssessmentandThreatModeling”(page8)

計画段階では、セキュリティを最大化するような方法で、ソフトウェアアーキテクト、コードに対する脅威の性質を決定する必要があります。これを行うには、ソフトウェアが攻撃される可能性のある方法を示しています脅威モデルを構築する必要があります。
RelevantChapter:「RiskAssessmentandThreatModeling」(ページ8)


>> Secure Coding Techniques and OS Security Features Help You Mitigate Those Risks

At each phase of the development process, you must take steps to mitigate risks:
Avoid exploitable coding flaws. During the implementation phase, you must avoid using insecure coding techniques that can lead to arbitrary code injection, denial of service, or other incorrect behavior.
Update your risk model continuously. Throughout the development process, you should continue to perform regular risk assessments and update your threat model as the software evolves so that it accurately reflects your risk.
Don’t reinvent the wheel. When securing your software and its data, you should always take advantage of built-in security features rather than writing your own if at all possible. In particular, you may need to determine whether a user is legitimate or not, send messages to servers securely to protect the integrity and secrecy of data in transit, or store data securely on local disks to protect data at rest.
RelevantChapters: “CodeSecurity”(page15),“RiskAssessmentandThreatModeling”(page8), “Authentication and Authorization” (page 20), “Cryptographic Services” (page 23)

コー​​ディング手法を確保し、OSのセキュリティ機能を使用すると、これらのリスクを軽減
開発プロセスの各段階では、リスクを軽減するための措置をとる必要があります。
悪用可能なコーディング上の欠陥を避けてください。実装フェーズでは、任意のコードインジェクション、サービス拒否、またはその他の不正な動作を引き起こす可能性が安全でないコーディング技術の使用を避ける必要があります。
継続的にリスクモデルを更新します。開発プロセス全体を通して、定期的なリスク評価を行い、それが正確にリスクを反映するように、ソフトウェアが進化するにつれ、あなたの脅威モデルを更新し続けなければならない。
車輪の再発明しないでください。お使いのソフトウェアとそのデータを保護する際に可能であれば、常に組み込みのセキュリティ機能を活用ではなく、あなた自身を記述を取る必要があります。安静時にデータを保護するために特定では、ユーザが正当であるか否かを判定する必要がある場合が送信中のデータの整合性と機密性を保護するために安全にサーバにメッセージを送ったり、ローカルディスクに確実にデータを記憶する。
RelevantChapters:「CodeSecurity」(page15)、「RiskAssessmentandThreatModeling」(ページ8)、「認証と承認」(20ページ)、「暗号化サービス」(23ページ)

>> Tools Can Help You Catch Coding Errors
ツールを使用すると、コーディングエラーをキャッチ助けることができる

In the testing phase, you should take advantage of static analyzers and other tools designed to help you find security vulnerabilities.
テスト段階では、静的アナライザと、セキュリティ上の脆弱性を見つけるのを助けるように設計された他のツールを利用する必要があります。

Relevant Chapters: “Other Security Resources” (page 38)
Prerequisites

>> Prerequisites
前提条件

This document assumes that you have already read Mac Technology Overview , iOS Technology Overview , or both.
このドキュメントでは、すでにMacテクノロジーの概要、iOSの技術の概要、またはその両方を読んでいることを前提としています。

>> Risk Assessment and Threat Modeling
>>--------
リスク評価と脅威のモデル化

Before you write a single line of code, take the time to design your software with security in mind.
あなたは、コードの1行も記述する前に、セキュリティを考慮して、あなたのソフトウェアを設計するために時間がかかる。

Doing this correctly is genuinely hard; if your security analysis process seems easy, you’re probably missing something fairly fundamental and losing most of the benefits of proper secure code design.
これを正しく行うと、本当に難しいです。セキュリティ分析プロセスが容易と思われる場合は、おそらくかなり基本的な何かが欠けているとの利点のほとんどを失っている
適切な安全なコード設計。

Risk assessment and threat modeling happens in three steps:
リスク評価と脅威モデリングは、3つのステップで行われます。

1. Assess risk. Determine how much you have to lose.
1。リスクを評価する。あなたが失うする必要がどのくらいかを確認します。

2. Determine potential threats. Figure out the various things your code does that could be attacked (including things that frameworks and libraries do on your behalf ).
2。潜在的な脅威を特定します。 (フレームワークやライブラリは、あなたに代わって行っていることを含む)を攻撃対象となるコードがない様々なことを把握。

3. Mitigate threats. Ensure that the parts of your code that could be attacked are well protected.
3。脅威を緩和。攻撃される可能性があるコードの部分が十分に保護されていることを確認。

>> Assessing Risk
リスクの評価

To assess the risk that your code would pose if compromised, you should first assume that your program will be attacked.
妥協した場合、コードがもたらすだろうとリスクを評価するには、まず、プログラムが攻撃されることを前提とすべきである。

>> Assume Your Software Will Be Attacked
お使いのソフトウェアが攻撃されると仮定し

The amount of time and effort that an attacker will spend attacking your program depends on several factors, including:
時間量と、努力、それは攻撃者は攻撃し続けるだろう、あなたのプログラム次第で、いくつかの要因の、以降を含む。

● The value of the data your program handles. Does it store thousands of credit card numbers or a user’s recipe collection?
データ、プログラムの値が処理されます。それはクレジットカード番号の数千またはユーザーのレシピコレクションを格納していますか?

● The trustworthiness and security of companies who provide services that your code depends on.
あなたのコードが依存するサービスを提供する企業の信頼性とセキュリティ。

● The specific clients who purchased your program. Is your word processing app being used by Joe’s Auto Repair or by Big Megacorp, Inc.?
あなたのプログラムを購入した特定のクライアント。ワープロアプリはJoeの自動車修理するか、ビッグ巨大企業、株式会社によって使用されている?

● How widely your program will be distributed. Is it an app that is used by a single, small workgroup, or is it built into an operating system that is about to be released worldwide?
どのくらいの規模か、あなたのプログラムの配布は。
それは、単一の、小さなワークグループによって使用され、またはそれが世界的に放出されようとしているオペレーティングシステムに組み込まれているアプリケーションはありますか?

Based on those same factors, you need to decide what level of risk is acceptable.
それらと同じ要因に基づいて、許容できるリスクのレベルを決定する必要があります。

A loss of data that will cost your company $1000 to rectify doesn't justify a $10,000 development effort to close all potential security bugs.
データ損失は、1000ドルの費用がかかるだろう是正する為に、正当化できない、10000ドルの開発努力は、閉じる為の、全ての潜在的なセキュリティバグを。

On the other hand, damage to your company's reputation might be worth far more in the long run than it would cost to design and develop secure code.
一方で、ダメージはあなたの会社の評判への、価値かもしれない、はるか長期的の、費用をかけたよりも、設計と、開発する安全なコードへの。

>> Evaluate the Risk
リスクを評価する

Here are some factors to consider when evaluating risk:
ここでは、リスクを評価する際に考慮すべきいくつかの要因は以下のとおりです。

● What is the worst thing that can happen if your software is successfully attacked?
お使いのソフトウェアが正常に攻撃された場合に発生することができる最悪のことは何ですか?

Will it allow theft of a user’s identity, allow an attacker to gain control of a user’s computer, or just enable a hacker to get an unusually high score in pinball?
それは、ユーザーのアイデンティティの盗難は、攻撃者がユーザーのコンピュータのコントロールを得るか、単にピンボールでの異常に高いスコアを取得するためにハッカーを可能にすることを可能にできるようになります?

● How hard is it to mount a successful attack?
それが成功した攻撃をマウントする方法は難しい?

If exploiting a vulnerability would require installing a Trojan horse on the user's computer that can take advantage of a race condition that occurs only once in 50 times the program starts up, you might decide the level of risk is acceptable.
脆弱性を利用すると、プログラムが起動する度だけ50回で発生する競合状態を利用することができ、ユーザーのコンピュータにトロイの木馬をインストールが必要となる場合は、リスクのレベルが許容されるかを決定可能性があります。

If the exploit can be put into a script and used by script kiddies (attackers who run prewritten attack scripts) or be automated to spread by botnets (networks of compromised computers), the level of risk is much higher.
エクスプロイトは、スクリプトに入れて、スクリプトキディ(あらかじめ記述攻撃スクリプトを実行する攻撃者)が使用するか、ボットネット(侵害されたコンピュータのネットワーク)によって拡散するように自動化することができる場合には、リスクのレベルは非常に高い。


● How big a target is it?
Did you sell a hundred copies of your app, or is it installed by default on hundreds of thousands of
computers?
Is it vulnerable by default, or only after a user chooses an unusual set of options?
● How many users would be affected?
An attack on an end user’s machine usually affects one or two people, but a denial of service attack on a
server might affect thousands of users if even one server is attacked. Similarly, a worm spread by a common
email program might infect thousands of computers.
● How accessible is the target?
Does running the program require local access, or does the program accept requests across a network?
Is authentication required in order to establish a connection, or can anyone send requests to the program?




>> Thanks.
Security Overview
https://developer.apple.com/library/ios/documentation/security/conceptual/security_overview/Security_Overview.pdf