Faster recognition and removal of child sexual abuse material online


The LIBRA project


Susanne Drakborg
[email protected]

Technological development has led to an explosive increase of child sexual abuse material online. The number of reported images of suspected child sexual abuse has increased from 3,000 images (1998) to 18.4 million images in 2018. And that, of course, does not include all images not yet identified. An average police case of possession of child sexual abuse material contains 30 000 images. The largest cases contain almost ten million images of child sexual abuse. The consequences are devastating. Research shows that online abuse, i.e. when the child hasn’t met the perpetrator offline, can be just as traumatic as abuse that takes placeoffline. Knowing that images and videos are spread and shared online creates immense suffering and re-traumatization for the children who have been abused. To stop this and to identify the perpetrators, better technical tools are required.

Abuse, as traumatic online as offline

The LIBRA project aims to find and reduce abuse material online, as well as help identify children who have been abused. The project consists of a hash control server, which finds files that have already been classified as abuse material. The hash control server neither shows nor downloads the material for those who use the tool. This means that not only the police but also other stakeholders – such as internet service providers – can use the technology without dealing with child sexual abuse material, which would be illegal. The tool quickly scans the internet, including the darknet, and gives a reliable indication of how widespread the images are. After just three test months, 5.5 million images of child sexual abuse were found on the servers of a few voluntary operators. The statistics from the project can be used to advocate better solutions and global cooperation, especially among Internet service providers.

Co-financing between Childhood and the Dutch Ministry of Justice

The project is run by Web-IQ, a Dutch company specialized in darknet technology and in revealing child sexual abuse. Childhood and the Dutch Ministry of Justice are co-financing the project. The project idea was born when Web-IQ’s founder and CEO participated in a roundtable discussion on artificial intelligence (AI), organized by Childhood.

Illustration: private

.acf-map { width: 100%; height: 400px; /*border: #ccc solid 1px;*/ /*margin: 20px 0;*/ } // Fixes potential theme css conflict. .acf-map img { max-width: inherit !important; } (function( $ ) { /** * initMap * * Renders a Google Map onto the selected jQuery element * * @date 22/10/19 * @since 5.8.6 * * @param jQuery $el The jQuery element. * @return object The map instance. */ function initMap( $el ) { // Find marker elements within map. var $markers = $el.find('.marker'); // Create gerenic map. var mapArgs = { zoom : $'zoom') || 16, mapTypeId : google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map( $el[0], mapArgs ); // Add markers. map.markers = []; $markers.each(function(){ initMarker( $(this), map ); }); // Center map based on markers. centerMap( map ); // Return map instance. return map; } /** * initMarker * * Creates a marker for the given jQuery element and map. * * @date 22/10/19 * @since 5.8.6 * * @param jQuery $el The jQuery element. * @param object The map instance. * @return object The marker instance. */ function initMarker( $marker, map ) { // Get position from marker. var lat = $'lat'); var lng = $'lng'); var latLng = { lat: parseFloat( lat ), lng: parseFloat( lng ) }; // Create marker instance. var marker = new google.maps.Marker({ position : latLng, map: map }); // Append to reference for later use. map.markers.push( marker ); // If marker contains HTML, add it to an infoWindow. if( $marker.html() ){ // Create info window. var infowindow = new google.maps.InfoWindow({ content: $marker.html() }); // Show info window when marker is clicked. google.maps.event.addListener(marker, 'click', function() { map, marker ); }); } } /** * centerMap * * Centers the map showing all markers in view. * * @date 22/10/19 * @since 5.8.6 * * @param object The map instance. * @return void */ function centerMap( map ) { // Create map boundaries from all map markers. var bounds = new google.maps.LatLngBounds(); map.markers.forEach(function( marker ){ bounds.extend({ lat:, lng: marker.position.lng() }); }); // Case: Single marker. if( map.markers.length == 1 ){ map.setCenter( bounds.getCenter() ); // Case: Multiple markers. } else{ map.fitBounds( bounds ); } } // Render maps on page load. $(document).ready(function(){ $('.acf-map').each(function(){ var map = initMap( $(this) ); }); }); })(jQuery);