permissions := strconv.Atoi(os.Getenv("filePermissions"));
fMode := os.FileMode(permissions)
os.chmod(filePath, fMode);
...
String permissionMask = System.getProperty("defaultFileMask");
Path filePath = userFile.toPath();
...
Set<PosixFilePermission> perms = PosixFilePermissions.fromString(permissionMask);
Files.setPosixFilePermissions(filePath, perms);
...
$rName = $_GET['publicReport'];
chmod("/home/". authenticateUser . "/public_html/" . rName,"0755");
...
publicReport
como, por ejemplo, "../../localuser/public_html/.htpasswd
", la aplicaci贸n har谩 que el archivo especificado sea legible para el usuario malintencionado.
...
$mask = $CONFIG_TXT['perms'];
chmod($filename,$mask);
...
permissions = os.getenv("filePermissions");
os.chmod(filePath, permissions);
...
...
rName = req['publicReport']
File.chmod("/home/#{authenticatedUser}/public_html/#{rName}", "0755")
...
publicReport
como, por ejemplo, "../../localuser/public_html/.htpasswd
", la aplicaci贸n har谩 que el archivo especificado sea legible para el usuario malintencionado.
...
mask = config_params['perms']
File.chmod(filename, mask)
...
crossdomain.xml
. Sin embargo, es necesario tener cuidado al cambiar la configuraci贸n porque una directiva entre dominios demasiado permisiva permitir谩 que una aplicaci贸n malintencionada se comunique con la aplicaci贸n v铆ctima de manera inadecuada, lo que provocar谩 suplantaci贸n de identidad, robo de datos, retransmisi贸n y otros ataques.
flash.system.Security.allowDomain("*");
*
como el argumento de allowDomain()
indica que otras aplicaciones SWF pueden tener acceso a los datos desde cualquier dominio.crossdomain.xml
. A partir de Flash Player 9,0,124,0, Adobe tambi茅n introdujo la capacidad de definir qu茅 encabezados personalizados Flash Player puede enviar a trav茅s de dominios. Sin embargo, se debe tener precauci贸n al definir esta configuraci贸n porque una directiva de encabezados personalizados demasiado permisiva, cuando se aplica junto con la directiva entre dominios demasiado permisiva, permitir谩 que una aplicaci贸n malintencionada env铆e encabezados de su elecci贸n a la aplicaci贸n de destino, lo que podr铆a conducir a diversos ataques o provocar errores en la ejecuci贸n de la aplicaci贸n que no sabe c贸mo manejar los encabezados recibidos.
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
*
como el valor del atributo headers
indica que cualquier encabezado se enviar谩 a trav茅s de dominios.crossdomain.xml
. Sin embargo, es necesario tener cuidado al decidir qui茅n puede influir en la configuraci贸n porque una directiva entre dominios demasiado permisiva permitir谩 que una aplicaci贸n malintencionada se comunique con la aplicaci贸n v铆ctima de manera inadecuada, lo que provocar谩 suplantaci贸n de identidad, robo de datos, retransmisi贸n y otros ataques. Las vulnerabilidades de omisi贸n de las restricciones de directivas se producen cuando:Ejemplo 2: El siguiente c贸digo utiliza el valor de uno de los par谩metros para el archivo SWF cargado con el fin de definir la lista de dominios de confianza.
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var url:String = String(params["url"]);
flash.system.Security.loadPolicyFile(url);
...
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var domain:String = String(params["domain"]);
flash.system.Security.allowDomain(domain);
...
crossdomain.xml
. Sin embargo, se deben tomar precauciones al definir esta configuraci贸n porque las aplicaciones SWF cargadas a trav茅s de HTTP son objeto de ataques Man-In-The-Middle (MITM) y, por tanto, no son de confianza.allowInsecureDomain()
, que desactiva la restricci贸n que impide que las aplicaciones SWF cargadas a trav茅s de HTTP tengan acceso a los datos de las aplicaciones SWF cargadas a trav茅s de HTTPS.
flash.system.Security.allowInsecureDomain("*");
sprintf()
, FormatMessageW()
o syslog()
.snprintf()
.
int main(int argc, char **argv){
char buf[128];
...
snprintf(buf,128,argv[1]);
}
%x
, que la funci贸n utiliza como argumentos a los que aplicar un formato. (En este ejemplo, la funci贸n no utiliza ning煤n argumento al que se le vaya aplicar un formato.) Mediante la directiva de formato %n
, el usuario malintencionado puede escribir en la pila lo que provoca que snprintf()
escriba la salida de un n煤mero de bytes hasta el momento en el argumento especificado (en lugar de leer un valor del argumento, que es el comportamiento previsto). Una versi贸n sofisticada de este ataque utilizar谩 cuatro operaciones de escritura escalonadas para controlar por completo el valor de un puntero en la pila.
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
se usa a menudo de la siguiente forma:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
es una cadena de formato, todas las directivas de formato incluidas en cmdBuf
se interpretan como se describe en el Example 1
.syslog()
:
...
syslog(LOG_ERR, "%s", cmdBuf);
...
sprintf()
, FormatMessageW()
, syslog()
, NSLog
o NSString.stringWithFormat
Ejemplo 1: el c贸digo siguiente utiliza un argumento de l铆nea de comandos como una cadena de formato en NSString.stringWithFormat:
.
int main(int argc, char **argv){
char buf[128];
...
[NSString stringWithFormat:argv[1], argv[2] ];
}
%x
, que la funci贸n utiliza como argumentos a los que aplicar un formato. (En este ejemplo, la funci贸n no utiliza ning煤n argumento al que se le vaya aplicar un formato.)
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
se usa a menudo de la siguiente forma:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
es una cadena de formato, todas las directivas de formato incluidas en cmdBuf
se interpretan como se describe en el Example 1
.syslog()
:Ejemplo 4: las clases principales de Apple proporcionan v铆as interesantes para explotar las vulnerabilidades de la cadena de formato.
...
syslog(LOG_ERR, "%s", cmdBuf);
...
String.stringByAppendingFormat()
se usa a menudo de la siguiente forma:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:[MyClass
formatInput:inputControl.text]];
...
stringByAppendingFormat()
:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:@"%@", [MyClass
formatInput:inputControl.text]];
...
strncpy()
, pueden provocar vulnerabilidades cuando se utilizan incorrectamente. La combinaci贸n de manipulaci贸n de memoria y presuposiciones err贸neas acerca del tama帽o y la formaci贸n de una unidad de datos es el motivo principal de la mayor铆a de desbordamientos del b煤fer.
void wrongNumberArgs(char *s, float f, int d) {
char buf[1024];
sprintf(buf, "Wrong number of %.512s");
}
strncpy()
, pueden provocar vulnerabilidades cuando se utilizan incorrectamente. La combinaci贸n de manipulaci贸n de memoria y presuposiciones err贸neas acerca del tama帽o y la formaci贸n de una unidad de datos es el motivo principal de la mayor铆a de desbordamientos del b煤fer.f
desde un flotador usando un especificador de formato %d
.
void ArgTypeMismatch(float f, int d, char *s, wchar *ws) {
char buf[1024];
sprintf(buf, "Wrong type of %d", f);
...
}
allowBackup
en true
(el valor predeterminado) y defina el atributo backupAgent
en la etiqueta <application>
.Environment.getExternalStorageDirectory()
devuelve una referencia al almacenamiento externo del dispositivo Android.private void WriteToFile(String what_to_write) {
try{
File root = Environment.getExternalStorageDirectory();
if(root.canWrite()) {
File dir = new File(root + "write_to_the_SDcard");
File datafile = new File(dir, number + ".extension");
FileWriter datawriter = new FileWriter(datafile);
BufferedWriter out = new BufferedWriter(datawriter);
out.write(what_to_write);
out.close();
}
}
}
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:ThisDeviceOnly
se les har谩 una copia de seguridad en iCloud y en iTunes incluso si se usan copias de seguridad sin cifrar que pueden restaurarse en cualquier dispositivo. Seg煤n el nivel de confidencialidad y privacidad de los datos almacenados, esto puede suponer un problema de privacidad.
...
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSData *token = [@"secret" dataUsingEncoding:NSUTF8StringEncoding];
// Configure KeyChain Item
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
[dict setObject:(__bridge id)kSecAttrAccessibleWhenUnlocked forKey:(__bridge id) kSecAttrAccessible];
OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);
...
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:ThisDeviceOnly
se les har谩 una copia de seguridad en iCloud y en iTunes incluso si se usan copias de seguridad sin cifrar que pueden restaurarse en cualquier dispositivo. Seg煤n el nivel de confidencialidad y privacidad de los datos almacenados, esto puede suponer un problema de privacidad.
...
// Configure KeyChain Item
let token = "secret"
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecValueData as String] = token as AnyObject?
...
query[kSecAttrAccessible as String] = kSecAttrAccessibleWhenUnlocked
SecItemAdd(query as CFDictionary, nil)
...
protected void onCreate(Bundle savedInstanceState) {
...
try {
File httpCacheDir = new File(context.getExternalCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
HttpResponseCache.install(httpCacheDir, httpCacheSize);
} catch (IOException e) {
Log.i(TAG, "HTTP response cache installation failed:" + e);
}
}
protected void onStop() {
...
HttpResponseCache cache = HttpResponseCache.getInstalled();
if (cache != null) {
cache.flush();
}
}
{app ID}/Library/Caches/com.mycompany.myapp/Cache.db*
.{app ID}/Library/Caches/com.mycompany.myapp/Cache.db*
.{app ID}/Library/Caches/com.mycompany.myapp/Cache.db*
. diskCapacity
o memoryCapacity
de la clase URLCache
en 0, deshabilitan realmente el sistema de cach茅 de respuesta de HTTP(S). Sin embargo, la documentaci贸n de NSURLCache
indica que tanto la cach茅 del disco como la de la memoria se truncar谩n en los tama帽os configurados 煤nicamente si al dispositivo le queda poca memoria o poco espacio en disco. Ambas configuraciones est谩n dise帽adas para que el sistema libere recursos del sistema y mejore el rendimiento, no como un control de seguridad.{app ID}/Library/Caches/com.mycompany.myapp/Cache.db*
. diskCapacity
o memoryCapacity
de la clase URLCache
en 0, deshabilitan realmente el sistema de cach茅 de respuesta de HTTP(S). Sin embargo, la documentaci贸n de NSURLCache
indica que tanto la cach茅 del disco como la de la memoria se truncar谩n en los tama帽os configurados 煤nicamente si al dispositivo le queda poca memoria o poco espacio en disco. Ambas configuraciones est谩n dise帽adas para que el sistema libere recursos del sistema y mejore el rendimiento, no como un control de seguridad.NSFileManager
como constantes que deben asignarse como el valor de la clave NSFileProtectionKey
en un NSDictionary
asociado a la instancia de NSFileManager
, y se pueden crear archivos o modificar su clase de protecci贸n de datos mediante el uso de funciones NSFileManager
como setAttributes:ofItemAtPath:error:
, attributesOfItemAtPath:error:
y createFileAtPath:contents:attributes:
. Adem谩s, las constantes de protecci贸n de datos correspondientes se definen para objetos NSData
como NSDataWritingOptions
que pueden pasarse como el argumento options
a las funciones NSData
writeToURL:options:error:
y writeToFile:options:error:
. Las definiciones de las diversas constantes de clases de protecci贸n de datos para NSFileManager
y NSData
son las siguientes:NSFileProtectionComplete
, NSDataWritingFileProtectionComplete
:NSFileProtectionCompleteUnlessOpen
, NSDataWritingFileProtectionCompleteUnlessOpen
:NSFileProtectionCompleteUntilFirstUserAuthentication
, NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication
:NSFileProtectionNone
, NSDataWritingFileProtectionNone
:NSFileProtectionCompleteUnlessOpen
o NSFileProtectionCompleteUntilFirstUserAuthentication
, se podr谩 cifrar con una clave derivada del c贸digo de acceso del usuario y del UID del dispositivo, los datos seguir谩n siendo accesibles en determinadas circunstancias. Por lo tanto, deben revisarse con atenci贸n los usos de NSFileProtectionCompleteUnlessOpen
o NSFileProtectionCompleteUntilFirstUserAuthentication
para determinar si se necesita mayor protecci贸n con NSFileProtectionComplete
.Ejemplo 2: en el siguiente ejemplo, los datos solo est谩n protegidos hasta que el usuario enciende el dispositivo y proporciona el c贸digo de acceso por primera vez (hasta que vuelva a reiniciarse):
...
filepath = [self.GetDocumentDirectory stringByAppendingPathComponent:self.setFilename];
...
NSDictionary *protection = [NSDictionary dictionaryWithObject:NSFileProtectionCompleteUntilFirstUserAuthentication forKey:NSFileProtectionKey];
...
[[NSFileManager defaultManager] setAttributes:protection ofItemAtPath:filepath error:nil];
...
BOOL ok = [testToWrite writeToFile:filepath atomically:YES encoding:NSUnicodeStringEncoding error:&err];
...
...
filepath = [self.GetDocumentDirectory stringByAppendingPathComponent:self.setFilename];
...
NSData *textData = [textToWrite dataUsingEncoding:NSUnicodeStingEncoding];
...
BOOL ok = [textData writeToFile:filepath options:NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication error:&err];
...
NSFileManager
como constantes que deben asignarse como el valor de la clave NSFileProtectionKey
en un Dictionary
asociado a la instancia de NSFileManager
, y se pueden crear archivos o modificar su clase de protecci贸n de datos mediante el uso de funciones NSFileManager
como setAttributes(_:ofItemAtPath:)
, attributesOfItemAtPath(_:)
y createFileAtPath(_:contents:attributes:)
. Adem谩s, se definen las constantes de protecci贸n de datos correspondientes para objetos NSData
en la enumeraci贸n NSDataWritingOptions
que pueden pasarse como el argumento options
a funciones NSData
writeToFile(_:options:)
. Las definiciones de las diversas constantes de clases de protecci贸n de datos para NSFileManager
y NSData
son las siguientes:NSFileProtectionComplete
, NSDataWritingOptions.DataWritingFileProtectionComplete
:NSFileProtectionCompleteUnlessOpen
, NSDataWritingOptions.DataWritingFileProtectionCompleteUnlessOpen
:NSFileProtectionCompleteUntilFirstUserAuthentication
, NSDataWritingOptions.DataWritingFileProtectionCompleteUntilFirstUserAuthentication
:NSFileProtectionNone
, NSDataWritingOptions.DataWritingFileProtectionNone
:NSFileProtectionCompleteUnlessOpen
o NSFileProtectionCompleteUntilFirstUserAuthentication
, se podr谩 cifrar con una clave derivada del c贸digo de acceso del usuario y del UID del dispositivo, los datos seguir谩n siendo accesibles en determinadas circunstancias. Por lo tanto, deben revisarse con atenci贸n los usos de NSFileProtectionCompleteUnlessOpen
o NSFileProtectionCompleteUntilFirstUserAuthentication
para determinar si se necesita mayor protecci贸n con NSFileProtectionComplete
.Ejemplo 2: en el siguiente ejemplo, los datos determinados solo est谩n protegidos hasta que el usuario enciende el dispositivo y proporciona el c贸digo de acceso por primera vez (hasta el siguiente reinicio).
...
let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let filename = "\(documentsPath)/tmp_activeTrans.txt"
let protection = [NSFileProtectionKey: NSFileProtectionCompleteUntilFirstUserAuthentication]
do {
try NSFileManager.defaultManager().setAttributes(protection, ofItemAtPath: filename)
} catch let error as NSError {
NSLog("Unable to change attributes: \(error.debugDescription)")
}
...
BOOL ok = textToWrite.writeToFile(filename, atomically:true)
...
...
let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let filename = "\(documentsPath)/tmp_activeTrans.txt"
...
BOOL ok = textData.writeToFile(filepath, options: .DataWritingFileProtectionCompleteUntilFirstUserAuthentication);
...
kSecAttrAccessible
en el diccionario de atributos de las claves. Las definiciones de las diversas constantes de accesibilidad de las claves son las siguientes:kSecAttrAccessibleAfterFirstUnlock
:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleAfterFirstUnlock
se podr谩 cifrar con una clave derivada del c贸digo de acceso del usuario y del UID del dispositivo, los datos seguir谩n siendo accesibles en determinadas circunstancias. Por lo tanto, deben revisarse con atenci贸n los usos de kSecAttrAccessibleAfterFirstUnlock
para determinar si se necesita mayor protecci贸n.
...
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSData *token = [@"secret" dataUsingEncoding:NSUTF8StringEncoding];
// Configure KeyChain Item
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
[dict setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlock forKey:(__bridge id) kSecAttrAccessible];
OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);
...
kSecAttrAccessible
en el diccionario de atributos de las claves. Las definiciones de las diversas constantes de accesibilidad de las claves son las siguientes:kSecAttrAccessibleAfterFirstUnlock
:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleAfterFirstUnlock
se podr谩 cifrar con una clave derivada del c贸digo de acceso del usuario y del UID del dispositivo, los datos seguir谩n siendo accesibles en determinadas circunstancias. Por lo tanto, deben revisarse con atenci贸n los usos de kSecAttrAccessibleAfterFirstUnlock
para determinar si se necesita mayor protecci贸n.
...
// Configure KeyChain Item
let token = "secret"
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecValueData as String] = token as AnyObject?
...
query[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
SecItemAdd(query as CFDictionary, nil)
...
NSFileManager
como constantes que deben asignarse como el valor de la clave NSFileProtectionKey
en un NSDictionary
asociado a la instancia de NSFileManager
, y se pueden crear archivos o modificar su clase de protecci贸n de datos mediante el uso de funciones NSFileManager
como setAttributes:ofItemAtPath:error:
, attributesOfItemAtPath:error:
y createFileAtPath:contents:attributes:
. Adem谩s, las constantes de protecci贸n de datos correspondientes se definen para objetos NSData
como NSDataWritingOptions
que pueden pasarse como el argumento options
a las funciones NSData
writeToURL:options:error:
y writeToFile:options:error:
. Las definiciones de las diversas constantes de clases de protecci贸n de datos para NSFileManager
y NSData
son las siguientes:NSFileProtectionComplete
, NSDataWritingFileProtectionComplete
:NSFileProtectionCompleteUnlessOpen
, NSDataWritingFileProtectionCompleteUnlessOpen
:NSFileProtectionCompleteUntilFirstUserAuthentication
, NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication
:NSFileProtectionNone
, NSDataWritingFileProtectionNone
:NSFileProtectionNone
provoca un cifrado con una clave derivada exclusivamente del UID del dispositivo. Esto permite que se pueda acceder a dichos archivos siempre que el dispositivo est谩 encendido, incluso cuando est谩 bloqueado con un c贸digo de acceso o durante el arranque. Por lo tanto, deben revisarse con atenci贸n los usos de NSFileProtectionNone
para determinar si se necesita mayor protecci贸n con una clase de protecci贸n de datos m谩s estricta.Ejemplo 2: en el siguiente ejemplo, los datos no est谩n protegidos (son accesibles en todo momento cuando el dispositivo est谩 encendido):
...
filepath = [self.GetDocumentDirectory stringByAppendingPathComponent:self.setFilename];
...
NSDictionary *protection = [NSDictionary dictionaryWithObject:NSFileProtectionNone forKey:NSFileProtectionKey];
...
[[NSFileManager defaultManager] setAttributes:protection ofItemAtPath:filepath error:nil];
...
BOOL ok = [testToWrite writeToFile:filepath atomically:YES encoding:NSUnicodeStringEncoding error:&err];
...
...
filepath = [self.GetDocumentDirectory stringByAppendingPathComponent:self.setFilename];
...
NSData *textData = [textToWrite dataUsingEncoding:NSUnicodeStingEncoding];
...
BOOL ok = [textData writeToFile:filepath options:NSDataWritingFileProtectionNone error:&err];
...
NSFileManager
como constantes que deben asignarse como el valor de la clave NSFileProtectionKey
en un Dictionary
asociado a la instancia de NSFileManager
. Se pueden crear archivos o modificar su clase de protecci贸n de datos mediante el uso de funciones NSFileManager
como setAttributes(_:ofItemAtPath:)
, attributesOfItemAtPath(_:)
y createFileAtPath(_:contents:attributes:)
. Adem谩s, se definen constantes de protecci贸n de datos correspondientes para objetos NSData
en la enumeraci贸n NSDataWritingOptions
que pueden pasarse como el argumento options
a funciones NSData
como
writeToFile(_:options:)
. Las definiciones de las diversas constantes de clases de protecci贸n de datos para NSFileManager
y NSData
son las siguientes:NSFileProtectionComplete
, NSDataWritingOptions.DataWritingFileProtectionComplete
:NSFileProtectionCompleteUnlessOpen
, NSDataWritingOptions.DataWritingFileProtectionCompleteUnlessOpen
:NSFileProtectionCompleteUntilFirstUserAuthentication
, NSDataWritingOptions.DataWritingFileProtectionCompleteUntilFirstUserAuthentication
:NSFileProtectionNone
, NSDataWritingOptions.DataWritingFileProtectionNone
:NSFileProtectionNone
provoca un cifrado con una clave derivada exclusivamente del UID del dispositivo. Esto permite que se pueda acceder a dichos archivos siempre que el dispositivo est谩 encendido, incluso cuando est谩 bloqueado con un c贸digo de acceso o durante el arranque. Por lo tanto, deben revisarse con atenci贸n los usos de NSFileProtectionNone
para determinar si se necesita mayor protecci贸n con una clase de protecci贸n de datos m谩s estricta.Ejemplo 2: en el siguiente ejemplo, los datos determinados no est谩n protegidos (es decir, son accesibles en todo momento cuando el dispositivo est谩 encendido).
...
let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let filename = "\(documentsPath)/tmp_activeTrans.txt"
let protection = [NSFileProtectionKey: NSFileProtectionNone]
do {
try NSFileManager.defaultManager().setAttributes(protection, ofItemAtPath: filename)
} catch let error as NSError {
NSLog("Unable to change attributes: \(error.debugDescription)")
}
...
BOOL ok = textToWrite.writeToFile(filename, atomically:true)
...
...
let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let filename = "\(documentsPath)/tmp_activeTrans.txt"
...
BOOL ok = textData.writeToFile(filepath, options: .DataWritingFileProtectionNone);
...
kSecAttrAccessible
en el diccionario de atributos de las claves. Las definiciones de las diversas constantes de accesibilidad de las claves son las siguientes:kSecAttrAccessibleAfterFirstUnlock
:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleAlways
provoca un cifrado con una llave derivada exclusivamente del UID del dispositivo. Esto permite que se pueda acceder a dichos archivos siempre que el dispositivo est谩 encendido, incluso cuando est谩 bloqueado con un c贸digo de acceso o durante el arranque. Por lo tanto, deben revisarse con atenci贸n los usos de kSecAttrAccessibleAlways
para determinar si se necesita mayor protecci贸n con un nivel de accesibilidad de las llaves m谩s estricto.
...
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSData *token = [@"secret" dataUsingEncoding:NSUTF8StringEncoding];
// Configure KeyChain Item
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
[dict setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id) kSecAttrAccessible];
OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);
...
kSecAttrAccessible
en el diccionario de atributos de las claves. Las definiciones de las diversas constantes de accesibilidad de las claves son las siguientes:kSecAttrAccessibleAfterFirstUnlock
:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleAlways
provoca un cifrado con una llave derivada exclusivamente del UID del dispositivo. Esto permite que se pueda acceder a dichos archivos siempre que el dispositivo est谩 encendido, incluso cuando est谩 bloqueado con un c贸digo de acceso o durante el arranque. Por lo tanto, deben revisarse con atenci贸n los usos de kSecAttrAccessibleAlways
para determinar si se necesita mayor protecci贸n con un nivel de accesibilidad de las llaves m谩s estricto.
...
// Configure KeyChain Item
let token = "secret"
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecValueData as String] = token as AnyObject?
...
query[kSecAttrAccessible as String] = kSecAttrAccessibleAlways
SecItemAdd(query as CFDictionary, nil)
...
Realm
sin cifrar:
Realm realm = Realm.getDefaultInstance();
Realm
sin cifrar:
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
RLMRealm *realm = [RLMRealm realmWithConfiguration:config error:nil];
Realm
sin cifrar:
let realm = try! Realm()