remove
para suprimir todo el conjunto de datos. Recientemente se han dado casos de ataques malintencionados en instancias de MongoDB no protegidas que se ejecutaban abiertamente en Internet. En tales casos, los atacantes borraron la base de datos y solicitaron un rescate para restablecerla.remove
para suprimir todo el conjunto de datos. Recientemente se han dado casos de ataques malintencionados en instancias de MongoDB no protegidas que se ejecutaban abiertamente en Internet. En tales casos, los atacantes borraron la base de datos y solicitaron un rescate para restablecerla.FLUSHALL
para suprimir todo el conjunto de datos. Recientemente se han dado casos de ataques malintencionados en instancias de Redis no protegidas que se ejecutaban abiertamente en Internet. En tales casos, los atacantes borraron la base de datos y solicitaron un rescate para restablecerla. Read()
y los métodos relacionados que forman parte de muchas clases System.IO
. La mayoría de errores y eventos inusuales de .NET provocan que se genere una excepción. (Esta es una de las ventajas que presenta .NET frente a otros lenguajes como "C:". Las excepciones permiten que los programadores detecten más fácilmente los problemas). Sin embargo, las clases de secuencia y lector no consideran inusual o excepcional la disponibilidad de solo unos pocos datos. Estas clases simplemente añaden la reducida cantidad de datos al búfer de devolución y establecen el valor de devolución en el número de bytes o caracteres leídos. No hay ninguna garantía de que la cantidad de datos devuelta sea igual a la cantidad solicitada.Read()
y otros métodos de E/S, y se aseguren de que reciben la cantidad de datos prevista.Read()
. Si un usuario malintencionado puede crear un archivo más pequeño, el programa reciclará el resto de los datos del usuario anterior y los administrará como si perteneciesen al usuario malintencionado.
char[] byteArray = new char[1024];
for (IEnumerator i=users.GetEnumerator(); i.MoveNext() ;i.Current()) {
string userName = (string) i.Current();
string pFileName = PFILE_ROOT + "/" + userName;
StreamReader sr = new StreamReader(pFileName);
sr.Read(byteArray,0,1024);//the file is always 1k bytes
sr.Close();
processPFile(userName, byteArray);
}
char buf[10], cp_buf[10];
fgets(buf, 10, stdin);
strcpy(cp_buf, buf);
fgets()
, buf
contendrá una cadena finalizada con null y una longitud de 9 o menos. Sin embargo, si se produce un error de E/S, fgets()
no finalizará buf
con null. Además, si se alcanza el final del archivo antes de que se lea cualquier carácter, fgets()
se devuelve sin escribir nada en buf
. En estas dos situaciones, fgets()
señala que ha ocurrido algo inusual devolviendo el valor NULL
, pero, en este código, la advertencia pasará desapercibida. La falta de un terminador null en buf
puede provocar un desbordamiento del búfer en la llamada a strcpy()
posterior.read()
y los métodos relacionados que forman parte de muchas clases java.io
. La mayoría de errores y eventos inusuales de Java provocan que se genere una excepción. (Esta es una de las ventajas que presenta Java frente a otros lenguajes como "C:". Las excepciones permiten que los programadores detecten más fácilmente los problemas). Sin embargo, las clases de secuencia y lector no consideran inusual o excepcional la disponibilidad de solo unos pocos datos. Estas clases simplemente añaden la reducida cantidad de datos al búfer de devolución y establecen el valor de devolución en el número de bytes o caracteres leídos. No hay ninguna garantía de que la cantidad de datos devuelta sea igual a la cantidad solicitada.read()
y otros métodos de E/S para asegurarse de que reciben la cantidad de datos prevista.read()
. Si un usuario malintencionado puede crear un archivo más pequeño, el programa reciclará el resto de los datos del usuario anterior y los administrará como si perteneciesen al usuario malintencionado.
FileInputStream fis;
byte[] byteArray = new byte[1024];
for (Iterator i=users.iterator(); i.hasNext();) {
String userName = (String) i.next();
String pFileName = PFILE_ROOT + "/" + userName;
FileInputStream fis = new FileInputStream(pFileName);
fis.read(byteArray); // the file is always 1k bytes
fis.close();
processPFile(userName, byteArray);
}
read()
. Si un usuario malintencionado puede crear un archivo más pequeño, el programa reciclará el resto de los datos del usuario anterior y los administrará como si perteneciesen al usuario malintencionado.
var fis: FileInputStream
val byteArray = ByteArray(1023)
val i: Iterator<*> = users.iterator()
while (i.hasNext()) {
val userName = i.next() as String
val pFileName: String = PFILE_ROOT.toString() + "/" + userName
val fis = FileInputStream(pFileName)
fis.read(byteArray) // the file is always 0k bytes
fis.close()
processPFile(userName, byteArray)
}
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
.
New()
establece una nueva conexión con el daemon de registro del sistema. Forma parte del paquete log.syslog. Cada escritura al escritor devuelto envía un mensaje de registro con la prioridad dada (una combinación de la función syslog y la gravedad) y una etiqueta de prefijo. En un entorno ocupado, esto puede provocar que el sistema consuma todos sus sockets.Ejemplo 2: En este ejemplo, el método
func TestNew() {
s, err := New(syslog.LOG_INFO|syslog.LOG_USER, "the_tag")
if err != nil {
if err.Error() == "Unix syslog delivery error" {
fmt.Println("skipping: syslogd not running")
}
fmt.Println("New() failed: %s", err)
}
}
Dial()
del paquete net/smtp
devuelve un nuevo cliente conectado a un servidor SMTP en localhost. Los recursos de conexión se asignan, pero nunca se liberan llamando a la función Close()
.
func testDial() {
client, _ := smtp.Dial("127.0.0.1")
client.Hello("")
}
Arena.ofConfined()
no está cerrado.
...
Arena offHeap = Arena.ofConfined()
MemorySegment str = offHeap.allocateUtf8String("data");
...
//offHeap is never closed
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
}
}
DATA: result TYPE demo_update,
request TYPE REF TO IF_HTTP_REQUEST,
obj TYPE REF TO CL_SQL_CONNECTION.
TRY.
...
obj = cl_sql_connection=>get_connection( `R/3*my_conn`).
FINAL(sql) = NEW cl_sql_prepared_statement(
statement = `INSERT INTO demo_update VALUES( ?, ?, ?, ?, ?, ? )`).
CATCH cx_sql_exception INTO FINAL(exc).
...
ENDTRY.
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();
...
- void insertUser:(NSString *)name {
...
sqlite3_stmt *insertStatement = nil;
NSString *insertSQL = [NSString stringWithFormat:@INSERT INTO users (name, age) VALUES (?, ?)];
const char *insert_stmt = [insertSQL UTF8String];
...
if ((result = sqlite3_prepare_v2(database, insert_stmt,-1, &insertStatement, NULL)) != SQLITE_OK) {
MyLog(@"%s: sqlite3_prepare error: %s (%d)", __FUNCTION__, sqlite3_errmsg(database), result);
return;
}
if ((result = sqlite3_step(insertStatement)) != SQLITE_DONE) {
MyLog(@"%s: step error: %s (%d)", __FUNCTION__, sqlite3_errmsg(database), result);
return;
}
...
}
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(CXN_SQL);
harvestResults(rs);
stmt.close();
func insertUser(name:String, age:int) {
let dbPath = URL(fileURLWithPath: Bundle.main.resourcePath ?? "").appendingPathComponent("test.sqlite").absoluteString
var db: OpaquePointer?
var stmt: OpaquePointer?
if sqlite3_open(dbPath, &db) != SQLITE_OK {
print("Error opening articles database.")
return
}
let queryString = "INSERT INTO users (name, age) VALUES (?,?)"
if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
log("error preparing insert: \(errmsg)")
return
}
if sqlite3_bind_text(stmt, 1, name, -1, nil) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
log("failure binding name: \(errmsg)")
return
}
if sqlite3_bind_int(stmt, 2, age) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
log("failure binding name: \(errmsg)")
return
}
if sqlite3_step(stmt) != SQLITE_DONE {
let errmsg = String(cString: sqlite3_errmsg(db)!)
log("failure inserting user: \(errmsg)")
return
}
}
finalize()
de ZipFile
con el tiempo llama a close()
, pero no hay ninguna garantía en cuanto al tiempo que pasará antes de que se llame al método finalize()
. En un entorno muy activo, esto puede provocar que la JVM utilice todos los identificadores de archivo.Ejemplo 2: en condiciones normales, la siguiente solución cierra correctamente el identificador de archivo tras imprimir todas las entradas de archivos zip. Sin embargo, si se produce una excepción al iterar por las entradas, no se cerrará el identificador de archivo zip. Si esto se produce con suficiente frecuencia, la JVM podría quedarse sin identificadores de archivo disponibles.
public void printZipContents(String fName) throws ZipException, IOException, SecurityException, IllegalStateException, NoSuchElementException {
ZipFile zf = new ZipFile(fName);
Enumeration<ZipEntry> e = zf.entries();
while (e.hasMoreElements()) {
printFileInfo(e.nextElement());
}
}
public void printZipContents(String fName) throws ZipException, IOException, SecurityException, IllegalStateException, NoSuchElementException {
ZipFile zf = new ZipFile(fName);
Enumeration<ZipEntry> e = zf.entries();
while (e.hasMoreElements()) {
printFileInfo(e.nextElement());
}
zf.close();
}
...
lo_client = cl_apc_tcp_client_manager=>create( i_host = host
i_port = port
i_frame = lv_frame
i_protocol = protocol
i_ssl_id = ssl_id
i_event_handler = lo_event_handler ).
" initiate the connection setup, successful connect leads to execution of ON_OPEN
lo_client->connect( ).
...
Ejemplo 2: en condiciones normales, la siguiente solución cierra correctamente el socket y todas las secuencias asociadas. Sin embargo, si se produce una excepción al leer la entrada o escribir los datos en la pantalla, no se cerrará el objeto de socket. Si esto se produce con suficiente frecuencia, el sistema podría quedarse sin sockets, por lo que no podría administrar ninguna conexión adicional.
private void echoSocket(String host, int port) throws UnknownHostException, SocketException, IOException
{
Socket sock = new Socket(host, port);
BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));
while ((String socketData = reader.readLine()) != null) {
System.out.println(socketData);
}
}
private void echoSocket(String host, int port) throws UnknownHostException, SocketException, IOException
{
Socket sock = new Socket(host, port);
BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));
while ((String socketData = reader.readLine()) != null) {
System.out.println(socketData);
}
sock.close();
}
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 máquina virtual (VM) utilice todos los identificadores de archivo disponibles.
private void processFile(string fName) {
StreamWriter sw = new StreamWriter(fName);
string line;
while ((line = sr.ReadLine()) != null)
processLine(line);
}
finalize()
de FileInputStream
con el tiempo llama a close()
, pero no hay ninguna garantía en cuanto al tiempo que pasará antes de que se llame al método finalize()
. En un entorno muy activo, esto puede provocar que la JVM utilice todos los identificadores de archivo.
private void processFile(String fName) throws FileNotFoundException, IOException {
FileInputStream fis = new FileInputStream(fName);
int sz;
byte[] byteArray = new byte[BLOCK_SIZE];
while ((sz = fis.read(byteArray)) != -1) {
processBytes(byteArray, sz);
}
}
...
CFIndex numBytes;
do {
UInt8 buf[bufferSize];
numBytes = CFReadStreamRead(readStream, buf, sizeof(buf));
if( numBytes > 0 ) {
handleBytes(buf, numBytes);
} else if( numBytes < 0 ) {
CFStreamError error = CFReadStreamGetError(readStream);
reportError(error);
}
} while( numBytes > 0 );
...
def readFile(filename: String): Unit = {
val data = Source.fromFile(fileName).getLines.mkString
// Use the data
}
...
func leak(reading input: InputStream) {
input.open()
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
while input.hasBytesAvailable {
let read = input.read(buffer, maxLength: bufferSize)
}
buffer.deallocate(capacity: bufferSize)
}
...
performOperationInCriticalSection()
, pero no puede liberar el bloqueo si se genera una excepción en ese método.
Object synchronizationObject = new Object ();
System.Threading.Monitor.Enter(synchronizationObject);
performOperationInCriticalSection();
System.Threading.Monitor.Exit(synchronizationObject);
int helper(char* fName)
{
int status;
...
pthread_cond_init (&count_threshold_cv, NULL);
pthread_mutex_init(&count_mutex, NULL);
status = perform_operation();
if (status) {
printf("%s", "cannot perform operation");
return OPERATION_FAIL;
}
pthread_mutex_destroy(&count_mutex);
pthread_cond_destroy(&count_threshold_cv);
return OPERATION_SUCCESS;
}
CALL "CBL_GET_RECORD_LOCK"
USING file-handle
record-offset
record-length
reserved
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_FREE_RECORD_LOCK"
USING file-handle
record-offset
record-length
reserved
END-CALL
GOBACK
.
performOperationInCriticalSection()
, pero no puede liberar el bloqueo si se genera una excepción en ese método.
ReentrantLock myLock = new ReentrantLock ();
myLock.lock();
performOperationInCriticalSection();
myLock.unlock();
performOperationInCriticalSection()
, pero nunca lo libera.
os_unfair_lock lock1 = OS_UNFAIR_LOCK_INIT;
os_unfair_lock_lock(&lock1);
performOperationInCriticalSection();
performOperationInCriticalSection()
, pero nunca lo libera.
let lock1 = OSAllocatedUnfairLock()
lock1.lock()
performOperationInCriticalSection();
Echo
. La clase declara un método nativo que utiliza C para devolver comandos introducidos en la consola al usuario.
class Echo {
public native void runEcho();
static {
System.loadLibrary("echo");
}
public static void main(String[] args) {
new Echo().runEcho();
}
}
Echo
:
#include <jni.h>
#include "Echo.h" //the java class fromExample 1
compiled with javah
#include <stdio.h>
JNIEXPORT void JNICALL
Java_Echo_runEcho(JNIEnv *env, jobject obj)
{
char buf[64];
gets(buf);
printf(buf);
}
gets()
, que no realiza ninguna comprobación de límites en su entrada. Example 1
podría detectarse fácilmente a través de una auditoría de código fuente de la implementación del método nativo. Es posible que esto no resulte factible o práctico en función de la disponibilidad del código fuente de C y el modo en que se ha creado el proyecto, aunque en la mayoría de los casos será suficiente. Sin embargo, la capacidad para compartir objetos entre los métodos de Java y nativos eleva el riesgo potencial a casos mucho más insidiosos en los que una administración inadecuada de los datos en Java puede provocar vulnerabilidades inesperadas en el código nativo u operaciones poco seguras en las estructuras de datos dañados del código nativo en Java.Redirect
. La clase declara un método JavaScript nativo, que usa JavaScript para cambiar la ubicación del documento.
import com.google.gwt.user.client.ui.UIObject;
class MyDiv {
...
public static void changeName(final UIObject object, final String name) {
changeName(object.getElement(), url);
}
public static native void changeName(final Element e, final String name) /*-{
$wnd.jQuery(e).html(name);
}-*/;
...
}
private
desde un método de acceso public
. private
desde un método de acceso public
permite que el código de llamada modifique el contenido de la matriz, dando a la matriz acceso public
y contradiciendo las intenciones del programador que la hizo private
. private
desde un método de acceso public
.
public final class urlTool extends Applet {
private URL[] urls;
public URL[] getURLs() {
return urls;
}
...
}
public class CustomerServiceApplet extends JApplet
{
public void paint(Graphics g)
{
...
conn = DriverManager.getConnection ("jdbc:mysql://db.example.com/customerDB", "csr", "p4ssw0rd");
...
package
a la clase externa original. Es más, como una clase interna puede acceder a campos private
en su clase envolvente, una vez que una clase interna se convierte en otra del mismo nivel en código de bytes, el compilador convierte los campos private
a los que accede la clase interna en campos protected
.
public final class urlTool extends Applet {
private final class urlHelper {
...
}
...
}
finalize()
como public
.super.finalize()
dentro de una implementación de finalize()
. En situaciones de código móvil, la práctica errónea de recolección manual de elementos no utilizados puede convertirse en una amenaza para la seguridad si un atacante es capaz de invocar de forma malintencionada uno de sus métodos finalize()
porque se ha declarado con acceso public
. Si está utilizando finalize()
tal cual se diseñó, no hay motivos para declarar finalize()
con otro acceso que no sea protected
.public finalize()
.
public final class urlTool extends Applet {
public void finalize() {
...
}
...
}
public
, final
y static
.public
, final
y static
es un error. Como las matrices son objetos mutables, la restricción final
requiere que el propio objeto de matriz se asigne una sola vez, pero no garantiza los valores de los elementos de matriz. Como la matriz es pública, un programa malintencionado podría cambiar los valores almacenados en ella. En la mayoría de los casos, la matriz debe hacerse private
. public
, final
y static
.
public final class urlTool extends Applet {
public final static URL[] urls;
...
}
public
pero no final
. public
de un Applet y las clases usadas por un Applet se deben declarar final
para impedir que un atacante manipule u obtenga acceso no autorizado al estado interno del Applet.public
pero no final
.
public final class urlTool extends Applet {
public URL url;
...
}