Una mala calidad del código lleva a un comportamiento no predecible. Desde la perspectiva de un usuario, muchas veces también supone una usabilidad limitada. Pero para un atacante es una oportunidad para atacar al sistema de formas insospechadas.
1
debe transferirse al primer parámetro (el número de versión) de la siguiente función del sistema de archivos:
__xmknod
2
debe transferirse al tercer parámetro (el argumento de grupo) de las siguientes funciones de cadenas de caracteres amplias:
__wcstod_internal
__wcstof_internal
_wcstol_internal
__wcstold_internal
__wcstoul_internal
3
debe transferirse como primer parámetro (el número de versión) de las siguientes funciones del sistema de archivos:
__xstat
__lxstat
__fxstat
__xstat64
__lxstat64
__fxstat64
std::auto_ptr<foo> p(new foo);
foo* rawFoo = p.get();
delete rawFoo;
delete
, la clase de administración sabrá que no puede seguir utilizando el puntero.int a = (Int32)i + (Int32)j;
lanza una excepción no controlada y bloquea la aplicación en tiempo de ejecución.
class Program
{
static int? i = j;
static int? j;
static void Main(string[] args)
{
j = 100;
int a = (Int32)i + (Int32)j;
Console.WriteLine(i);
Console.WriteLine(j);
Console.WriteLine(a);
}
}
aN
y bN
, pero en el caso predeterminado, el programador ha establecido accidentalmente el valor de aN
dos veces.
switch (ctl) {
case -1:
aN = 0; bN = 0;
break;
case 0:
aN = i; bN = -i;
break;
case 1:
aN = i + NEXT_SZ; bN = i - NEXT_SZ;
break;
default:
aN = -1; aN = -1;
break;
}
game
sin inicializarla.
struct Game {
address player;
}
function play(uint256 number) payable public {
…
Game game;
game.player = msg.sender;
…
}
Finalize()
de StreamReader
con el tiempo llama a Close()
, pero no hay ninguna garantía en cuanto el tiempo que pasará antes de que se llame al método Finalize()
. De hecho, no hay ninguna garantía de que se llame en algún momento al método Finalize()
. En un entorno muy activo, esto puede provocar que la VM utilice todos los identificadores de archivo disponibles.Ejemplo 2: en condiciones normales, el siguiente código ejecuta una consulta de base de datos, procesa los resultados devueltos por la base de datos y cierra el objeto
private void processFile(string fName) {
StreamWriter sw = new StreamWriter(fName);
string line;
while ((line = sr.ReadLine()) != null)
processLine(line);
}
SqlConnection
asignado. Sin embargo, si se produce una excepción al ejecutar el SQL o al procesar los resultados, el objeto SqlConnection
no se cerrará. Si esto ocurre con bastante frecuencia, la base de datos agotará los cursores disponibles y no podrá ejecutar ninguna otra consulta SQL.
...
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(queryString);
cmd.Connection = conn;
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
HarvestResults(rdr);
conn.Connection.Close();
...
int decodeFile(char* fName)
{
char buf[BUF_SZ];
FILE* f = fopen(fName, "r");
if (!f) {
printf("cannot open %s\n", fName);
return DECODE_FAIL;
} else {
while (fgets(buf, BUF_SZ, f)) {
if (!checkChecksum(buf)) {
return DECODE_FAIL;
} else {
decodeBlock(buf);
}
}
}
fclose(f);
return DECODE_SUCCESS;
}
CALL "CBL_CREATE_FILE"
USING filename
access-mode
deny-mode
device
file-handle
END-CALL
IF return-code NOT = 0
DISPLAY "Error!"
GOBACK
ELSE
PERFORM write-data
IF ws-status-code NOT = 0
DISPLAY "Error!"
GOBACK
ELSE
DISPLAY "Success!"
END-IF
END-IF
CALL "CBL_CLOSE_FILE"
USING file-handle
END-CALL
GOBACK
.
BEGIN
...
F1 := UTL_FILE.FOPEN('user_dir','u12345.tmp','R',256);
UTL_FILE.GET_LINE(F1,V1,32767);
...
END;
Camera
en los controladores de eventos onPause()
, onStop()
o onDestroy()
.Camera
que no se ha liberado en las devoluciones de llamada onPause()
, onStop()
o onDestroy()
. El SO Android invoca estas devoluciones de llamadas cada vez que necesita enviar la actividad actual al segundo plano o cuando necesita destruir temporalmente la actividad debido al bajo nivel de recursos del sistema. Al no liberar correctamente el objeto Camera
, la actividad impide que otras aplicaciones (o incluso futuras instancias de la misma aplicación) accedan a la cámara. Además, la conservación de la posesión de la instancia Camera
mientras la actividad se encuentra pausada puede afectar negativamente a la experiencia del usuario debido a un consumo innecesario de la energía de la batería.onPause()
, que debe utilizarse para liberar el objeto Camera
, ni lo libera correctamente durante la secuencia de cierre.
public class UnreleasedCameraActivity extends Activity {
private Camera cam;
@Override
public void onCreate(Bundle state) {
...
}
@Override
public void onRestart() {
...
}
@Override
public void onStop() {
cam.stopPreview();
}
}
MediaRecorder
, MediaPlayer
o AudioRecord
en sus controladores de eventos onPause()
, onStop()
o onDestroy()
.onPause()
, onStop()
o onDestroy()
. El SO Android invoca estas devoluciones de llamadas cada vez que necesita enviar la actividad actual al segundo plano o cuando necesita destruir temporalmente la actividad debido al bajo nivel de recursos del sistema. Al no liberar correctamente el objeto multimedia, la actividad provoca que los siguientes accesos al hardware multimedia de Android (por parte de la misma aplicación u otras) se reviertan a las implementaciones de software o incluso presenten errores de forma conjunta. Al dejar abiertas demasiadas instancias multimedia sin liberar, Android generará excepciones, lo que provocará realmente una denegación de servicio. Además, la conservación de la posesión de la instancia multimedia mientras la actividad se encuentra pausada puede afectar negativamente a la experiencia del usuario debido a un consumo innecesario de la energía de la batería.onPause()
, que debe utilizarse para liberar el objeto multimedia, ni lo libera correctamente durante la secuencia de cierre.
public class UnreleasedMediaActivity extends Activity {
private MediaPlayer mp;
@Override
public void onCreate(Bundle state) {
...
}
@Override
public void onRestart() {
...
}
@Override
public void onStop() {
mp.stop();
}
}
onPause()
, onStop()
o onDestroy()
.onPause()
, onStop()
o onDestroy()
. El SO Android invoca estas devoluciones de llamadas cada vez que necesita enviar la actividad actual al segundo plano o cuando necesita destruir temporalmente la actividad debido al bajo nivel de recursos del sistema. Al no cerrar correctamente la base de datos, la actividad puede agotar los cursores disponibles del dispositivo si la actividad se reinicia constantemente. Además, en función de la implementación, el sistema operativo Android puede generar también DatabaseObjectNotClosedException
, lo que provoca que se bloquee la aplicación si no se detecta la excepción.onPause()
, que debería usarse para liberar el objeto de base de datos, ni lo libera correctamente durante la secuencia de cierre.
public class MyDBHelper extends SQLiteOpenHelper {
...
}
public class UnreleasedDBActivity extends Activity {
private myDBHelper dbHelper;
private SQLiteDatabase db;
@Override
public void onCreate(Bundle state) {
...
db = dbHelper.getWritableDatabase();
...
}
@Override
public void onRestart() {
...
}
@Override
public void onStop() {
db.insert(cached_data); // flush cached data
}
}